我想动态查询我想要检索的类中的哪些对象. getattr看起来像我想要的,它对类中的顶级对象执行得很好.但是,我还想指定子元素.
class MyObj(object):
def __init__(self):
self.d = {'a':1,'b':2}
self.c = 3
myobj = MyObj()
val = getattr(myobj,"c")
print val # Correctly prints 3
val = getattr(myobj,"d['a']") # Seemingly incorrectly formatted query
print val # Throws an AttributeError
如何通过字符串获取对象的字典元素?
最佳答案
你得到错误的原因是getattr(myobj,“d [‘a’]”)在对象上查找名为d [‘a’]的属性,而没有一个属性.您的属性名为d,它是一个字典.一旦您获得了对字典的引用,就可以访问其中的项目.
mydict = getattr(myobj,"d")
val = mydict["a"]
或者正如其他人所示,你可以在一步中将它结合起来(我把它显示为两个以更好地说明实际发生的事情):
val = getattr(myobj,"d")["a"]
您的问题暗示您认为对象中字典的项是对象的“子元素”.但是,字典中的项与对象的属性不同. (getattr()也不会像o.a那样工作;但是它只获取一个对象的一个属性.如果那也是一个对象而你想得到它的一个属性,那就是另一个getattr().)
您可以非常轻松地编写一个遍历属性路径的函数(以字符串形式给出),并尝试将每个名称解析为字典键或属性:
def resolve(obj,attrspec):
for attr in attrspec.split("."):
try:
obj = obj[attr]
except (TypeError,KeyError):
obj = getattr(obj,attr)
return obj
这里的基本思想是你采用一个路径,并且对于路径的每个组件,尝试在类似字典的容器中找到一个项目或者在一个对象上找到一个属性.当你到达路径的尽头时,返回你所拥有的.你的例子将是解决(myobj,“d.a”)