如何使用getattr访问python对象中的列表元素?



在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'

不要使用 eval。

您可以使用getattr但字符串中不需要.和索引,只需要属性名称。

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

输出

42

这假设您实际上需要v是一个字符串(即它来自用户输入(。否则使用简单的方法

print(t.x[0])

也许这就是你需要的:

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

如果值str则需要使用eval()。您可以在Test中覆盖__getattr__并在那里使用它

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

最新更新