我可以使用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'
我可以使用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'
这不是因为它更快或更慢,而是因为官方 API 在 所有 情况下都适用,包括那些没有 __dict__
的类(例如使用__slots__
时),或者当一个对象实现了__getattr__
或__getattribute__
钩子函数时,或者当要访问的属性是一个描述器(如一个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()
会做更多的工作。
getattr
函数也会遵循方法解析顺序(MRO)和描述符(常见例子是属性)。 - user395760