Python - 如何像访问字典一样访问对象属性

10
>>> my_object.name = 'stuff'
>>> my_str = 'name'
>>> my_object[my_str] # won't work because it's not a dictionary :)

我该如何访问在my_str中定义的my_object的字段?

顺便说一下,在JavaScript中这是完全有效的。 - watashiSHUN
4个回答

27
getattr(my_object, my_str)

或者,如果您不确定名称是否存在于键中并希望提供备用选项而不是抛出异常:

getattr(my_object, my_str, "Could not find anything")

更多关于getattr的内容。


对于 myobject.__dict__[my_str],有什么优势吗?更好的性能吗? - Pierre de LESPINAY
3
我能否依赖于标准的“更符合Python风格”的答案?此外,访问私有__变量也带来了一系列风险。你试图做的是getattr和setattr的工作。 - Tom
警告语:如果你使用动态属性名称,应该在使用getattr之前添加 try: 或者 if hasattr( 来确保您不尝试访问不存在的内容。 - oriadam
什么?如果属性不存在,getattr不会抛出异常。它基本上是if hasattr give me that else give me the default的语法糖。 - Tom
2
为了回答我自己将来的无知,那是因为我总是传递一个默认值的第三个参数,例如 getattr(my_object, my_str, None) - Tom

3
您可以通过定义一小组方法来为您的类的对象提供对 [] 运算符的支持 - 主要是 getitemsetitem。请参见文档中接下来的几个条目,以了解需要实现的其他方法,以获得完整的支持。

0
>>> myobject.__dict__[my_str]
'stuff'

2
请注意,这会破坏属性、__slots____getattr__/__getattribute__/__setattr__ 重载 - 还有可能是其他一些东西。 - user395760
好的,谢谢您提供的信息。您认为getattr(my_object, my_str)在性能方面更好吗? - Pierre de LESPINAY
2
性能在这里是最不需要担心的。如果确实需要考虑性能,你可以将那部分(即整个循环,以避免多次跨语言调用)重写为C语言,但在考虑这样的优化之前,你应该有充分的证据表明存在无法接受的减速情况。 - user395760
虽然这段代码可能提供了解决问题的方案,但强烈建议您提供有关为什么和/或如何回答问题的其他上下文信息。仅提供代码答案通常在长期内变得无用,因为未来遇到类似问题的观众无法理解解决方案背后的推理。 - E. Zeytinci

0

一般情况下,您不能使用__dict__方法。永远可行的方法是

getattr(myobject, my_str)

如果您想要类似字典的访问方式,只需定义一个带有重载索引运算符的类即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接