Python - getattr与连接操作

3 投票
2 回答
882 浏览
提问于 2025-04-17 04:23

我在代码中玩弄getattr这个函数时发现了一些事情:

myVariable = foo.A.bar

这个是可以正常工作的……但是像这样:

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

就会报错,说foo里面没有属性A.bar。我哪里出错了呢?谢谢!

2 个回答

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",但显然这个东西是不存在的。

12

因为在 foo 上没有 A.bar 这个属性。属性 bar 是指向 A 的对象的一部分,而 Afoo 的一个属性。你需要这样做:

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

撰写回答