Как получить доступ к элементу списка в объекте python с помощью getattr? - PullRequest
0 голосов
/ 06 января 2020

В python3 У меня есть следующий полный код:

class Test:
    def __init__(self):
        self.x = [42, 4711]
        self.y = [4, 6]
        self.z = 99

t = Test()
v = 'x[1]' # or can be 'y[0]' or can be 'z' ...
print(eval('t.'+v))
print(getattr(t,v))

, который выдает ошибку для последней строки

AttributeError: 'Test' object has no attribute 'x[1]'

Есть ли способ получить доступ к списку внутри объект через getattr, или я должен использовать eval в этом случае?

Подсказка: индекс является частью строки! Я не знаю, является ли атрибут, к которому я собираюсь получить доступ, списком или просто значением. Это необходимо для следующих случаев:

v = 'x[0]'
v = 'x[1]'
v = 'y[0]'
v = 'z'

Ответы [ 3 ]

0 голосов
/ 06 января 2020

Может быть, это то, что вам нужно:

class Test:
    def __init__(self):
        self.x = [42, 4711]
        self.y = [4, 6]
        self.z = 99

t = Test()

my_x = getattr(t,'x')
print(my_x) # output : [42, 4711]
print(my_x[1]) # output : 4711
0 голосов
/ 06 января 2020

Если значение str, вам нужно использовать eval(). Вы можете переопределить __getattr__ в Test и использовать его там

class Test:
    def __init__(self):
        self.x = [42, 4711]
        self.y = [4, 6]
        self.z = 99

    def __getattr__(self, item):
        return eval('self.' + item)


t = Test()
v = 'x[1]'
print(getattr(t, v)) # 4711
0 голосов
/ 06 января 2020

Не используйте eval.

Вы можете использовать getattr, но вам не нужны ни ., ни индекс в строке, просто имя атрибута.

t = Test()
v = 'x'
print(getattr(t, v)[0])

Outputs

42

Предполагается, что вам действительно нужно, чтобы v была строкой (ie она получена из пользовательского ввода). В противном случае используйте тривиальный способ

print(t.x[0])
...