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.).

Author: Mehrdad, 2011-07-31

3 answers

Utilizar la función incorporada dir().

 315
Author: mouad,
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.

 59
Author: Eli Collins,
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'}
 41
Author: Slipstream,
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