在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