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

如何使用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

在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()
。您可以覆盖
测试中的
\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
以描述的一般方式来完成。我可以用out
eval
做同样的事情吗?我事先不知道索引。我甚至不知道这个对象是否是一个列表;见更新的问题。@Alex你为什么不知道?你没告诉我们什么?这感觉像是一个XY问题。无论哪种方式,如果不使用
eval
,这都是不可能的,但您确实不想使用它。您可以尝试使用正则表达式在字符串中搜索
[\d]
,并使用我显示的方式