如何使用getattr访问python对象中的列表元素?
在python3中,我有以下完整代码:如何使用getattr访问python对象中的列表元素?,python,getattr,Python,Getattr,在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)) 这会为最后一行抛出一个错误 Attribu
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()
。您可以覆盖测试中的\uuu getattr\uuu
,并在那里使用它
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
getattr(Test(),'x')
正在返回列表x,您还想要什么?我不知道对象是否是列表。索引也是字符串“v”的一部分。索引是字符串的一部分!也许你可以用两根绳子?一个是“x”,第二个是“1”?你能告诉我们字符串的来源、约束条件等吗?请假设这是一个基本问题->我可以用eval
以描述的一般方式来完成。我可以用outeval
做同样的事情吗?我事先不知道索引。我甚至不知道这个对象是否是一个列表;见更新的问题。@Alex你为什么不知道?你没告诉我们什么?这感觉像是一个XY问题。无论哪种方式,如果不使用eval
,这都是不可能的,但您确实不想使用它。您可以尝试使用正则表达式在字符串中搜索[\d]
,并使用我显示的方式