15

一个有点无聊的最佳实践问题。object.__dict__[some_key]我习惯性地使用动态查找对象属性值。现在我想知道哪个更好/更快:我目前的习惯或getattr(object,some_key). 如果一个更好,为什么?

>>> class SomeObject:
...     pass
... 
>>> so = SomeObject()
>>> so.name = 'an_object'
>>> getattr(so,'name')
'an_object'
>>> so.__dict__['name']
'an_object'
4

1 回答 1

51

你最好使用getattr()而不是直接进入__dict__结构。

不是因为它更快或更慢,而是因为官方 API 在所有情况下都有效,包括对于没有a 的类__dict____slots__例如使用时),或者当对象实现__getattr__or__getattribute__钩子时,或者当所讨论的属性是描述符时(例如 a property)或类属性。

如果您想知道是否有任何一种 Python 语句或技术比另一种更快,请使用该timeit模块衡量差异:

>>> import timeit
>>> class Foo(object):
...     pass
... 
>>> foo = Foo()
>>> foo.bar = 'spam'
>>> timeit.timeit("getattr(foo, 'bar')", 'from __main__ import foo')
0.2125859260559082
>>> timeit.timeit("foo.__dict__['bar']", 'from __main__ import foo')
0.1328279972076416

您可以看到直接访问__dict__速度更快,但getattr()工作量更大。

于 2012-12-29T18:58:22.303 回答