Obtener todos los atributos de objeto en Python?
Hay una manera de obtener todos los atributos/métodos/campos/etc. de un objeto en Python?
vars()
es cercano a lo que quiero, pero no funciona a menos que un objeto tenga un __dict__
, que no siempre es cierto (por ejemplo, no es cierto para un list
, un dict
, etc.).
3 answers
Utilizar la función incorporada dir()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-30 23:08:01
Lo que probablemente quieras es dir()
.
El problema es que las clases pueden anular el método especial __dir__
, que hace que dir()
devuelva lo que la clase quiera (aunque se les anima a devolver una lista precisa, esto no se aplica). Además, algunos objetos pueden implementar atributos dinámicos sobreescribiendo __getattr__
, pueden ser objetos proxy RPC o pueden ser instancias de clases de extensión C. Si su objeto es uno de estos ejemplos, es posible que no tengan un __dict__
o ser capaz de proporcionar una lista completa de atributos a través de __dir__
: muchos de estos objetos pueden tener tantos dinámica attrs no en realidad no sabe ¿qué tiene hasta que intente acceder a él.
A corto plazo, si dir()
no es suficiente, puede escribir una función que atraviese __dict__
para un objeto, entonces __dict__
para todas las clases en obj.__class__.__mro__
; aunque esto solo funcionará para objetos python normales. A largo plazo, es posible que tenga que utilizar la tipificación de pato + suposiciones - si parece un pato, cruza los dedos y espera que lo tenga .feathers
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 18:43:18
Utilizo __dict__
Ejemplo:
class MyObj(object):
def __init__(self):
self.name = 'Chuck Norris'
self.phone = '+6661'
obj = MyObj()
print(obj.__dict__)
# Output:
# {'phone': '+6661', 'name': 'Chuck Norris'}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-08 13:56:02