您收到错误的原因是getattr(myobj, "d['a']")
查找名为的属性d['a']
物体上,却没有一个。你的属性被命名为d
这是一本字典。一旦你查阅了字典,then您可以访问其中的项目。
mydict = getattr(myobj, "d")
val = mydict["a"]
或者正如其他人所示,您可以将其合并为一个步骤(我将其显示为两个步骤,以更好地说明实际发生的情况):
val = getattr(myobj, "d")["a"]
您的问题意味着您认为对象中字典的项目是该对象的“子元素”。然而,字典中的项目与对象的属性不同。 (getattr()
不适用于类似的东西o.a
不过,要么;它只是获取一个对象的一个属性。如果那也是一个对象并且你想得到其中一个its属性,那是另一个getattr()
.)
您可以非常轻松地编写一个函数,该函数遍历属性路径(以字符串形式给出)并尝试将每个名称解析为字典键或属性:
def resolve(obj, attrspec):
for attr in attrspec.split("."):
try:
obj = obj[attr]
except (TypeError, KeyError):
obj = getattr(obj, attr)
return obj
这里的基本思想是,您采用一条路径,并针对该路径的每个组成部分,尝试查找类似字典的容器中的项目或对象上的属性。当你到达路径的尽头时,归还你所拥有的东西。你的例子是resolve(myobj, "d.a")