Una pregunta un tanto noobisca, mejor práctica. Busco dinámicamente los valores de los atributos del objeto usando el object.__dict__[some_key]
como una cuestión de hábito. Ahora me pregunto cuál es mejor / más rápido: mi hábito actual o getattr(object,some_key)
. Si uno es mejor, ¿por qué?
>>> class SomeObject: ... pass ... >>> so = SomeObject() >>> so.name = 'an_object' >>> getattr(so,'name') 'an_object' >>> so.__dict__['name'] 'an_object'
Es mucho mejor usar getattr()
lugar de ir directamente a la estructura __dict__
.
No porque sea más rápido o más lento, sino porque la API oficial funciona en todas las circunstancias, incluso para las clases que no tienen un __dict__
(cuando se usa __slots__
), o cuando un objeto implementa los __getattr__
o __getattribute__
ganchos, o cuando el atributo en La pregunta es un descriptor (como una property
) o un atributo de clase.
Si desea saber si una instrucción o técnica de Python es más rápida que otra, use el módulo timeit
para medir la diferencia:
>>> 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
Puede ver que acceder directamente a __dict__
es más rápido, pero getattr()
hace mucho más trabajo.