Получить все атрибуты объектов в Python?

Есть ли способ получить все атрибуты/методы/поля/etc. объекта в Python?

vars() близок к тому, что я хочу, но он не работает, если у объекта нет __dict__, что не всегда верно (например, это неверно для a list, a dict, и др.).

Ответ 1

Используйте встроенную функцию dir().

Ответ 2

Что вы, возможно, хотите, это dir().

Ловушка заключается в том, что классы могут переопределять специальный метод __dir__, который заставляет dir() возвращать все, что хочет класс (хотя им рекомендуется возвращать точный список, это не применяется). Кроме того, некоторые объекты могут реализовать динамические атрибуты, переопределяя __getattr__, могут быть прокси-объектами RPC или могут быть экземплярами классов C-расширения. Если ваш объект является одним из этих примеров, у них может не быть __dict__ или он может предоставить полный список атрибутов через __dir__: у многих из этих объектов может быть так много динамических аттрибутов, которые он не знает на самом деле что у него есть, пока вы не попытаетесь получить к нему доступ.

В краткосрочном периоде, если dir() недостаточно, вы можете написать функцию, которая пересекает __dict__ для объекта, а затем __dict__ для всех классов в obj.__class__.__mro__; хотя это будет работать только для обычных объектов python. В конечном итоге вам, возможно, придется использовать утиную формулировку + предположения - если это похоже на утку, скрестите пальцы и надейтесь, что она имеет .feathers.

Ответ 3

Я использую __dict__

Пример:

class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)

# Output:  
# {'phone': '+6661', 'name': 'Chuck Norris'}

Ответ 4

Вы можете использовать dir(your_object) для получения атрибутов и getattr(your_object, your_object_attr) для получения значений

использование:

for att in dir(your_object):
    print (att, getattr(your_object,att))