3

因此,在我的代码中使用 getattr 时,我发现了以下内容:

myVariable = foo.A.bar

工作......但这样的事情:

B = "A"
myVariable = getattr(foo, B + ".bar")

返回 foo 不包含属性 A.bar 的错误。我哪里错了?谢谢!

4

2 回答 2

12

因为 上没有A.bar属性foo。属性bar是 指向的对象的一部分,A是 的一个属性foo。你需要

getattr(foo.A, "bar")

或者

getattr(getattr(foo, 'A'), 'bar')

访问深层属性的通用代码是在点上拆分,直到找到最后一部分(我是从内存中写的,未经测试):

def getattr_deep(start, attr):
    obj = start
    for part in attr.split('.'):
        obj = getattr(obj, part)
    return obj

getattr_deep(foo, 'A.bar')
于 2011-10-15T15:52:54.963 回答
2

相当于:

myVariable = foo.A.bar 

使用 getattr 需要两个步骤。

aObject = getattr(foo, 'A') 
myVariable = getattr(aobject, 'bar')

以您的方式执行 `myVariable = getattr(foo, B + ".bar") 意味着 'myVariable = getattr(foo, "B.bar")' getAttr 现在查找显然不存在的字符串“B.bar”。

于 2011-10-15T16:02:55.237 回答