¿Hay alguna manera de obtener todos los atributos / métodos / campos / etc. de un objeto en Python?
vars()
está cerca de 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 una list
, un dict
, etc.).
Utilice la función incorporada dir()
.
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 recomienda que devuelvan una lista precisa, esto no se aplica). Además, algunos objetos pueden implementar atributos dynamics al reemplazar __getattr__
, pueden ser objetos de 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 que puedan proporcionar una lista completa de atributos a través de __dir__
: muchos de estos objetos pueden tener tantos atributos dynamics que en realidad no sabrá lo que tiene hasta intentas acceder a ella
A corto plazo, si dir()
no es suficiente, puede escribir una función que atraviese __dict__
para un objeto, luego __dict__
para todas las clases en obj.__class__.__mro__
; aunque esto solo funcionará para objetos de python normales. A la larga, es posible que tenga que usar suposiciones .feathers
pato – si se parece a un pato, cruce los dedos y espere que tenga .feathers
.
Yo uso __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'}
Puedes usar dir(your_object)
para obtener los atributos y getattr(your_object, your_object_attr)
para obtener los valores
uso:
for att in dir(your_object): print (att, getattr(your_object,att))