一个有点愚蠢的最佳实践问题。作为习惯,我使用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'
答案 0 :(得分:42)
使用getattr()
而不是直接使用__dict__
结构会更好。
不是因为它更快或更慢,而是因为官方API在所有环境中工作,包括不的类具有__dict__
(使用时)例如__slots__
,或者当一个对象实现__getattr__
或__getattribute__
个钩子,或者当有问题的属性是descriptor时(例如property
} ),或类属性。
如果您想知道任何一个python语句或技术是否比另一个更快,请使用timeit
module 衡量差异:
>>> 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()
可以做得更多。