Есть ли способ получить все атрибуты/методы/поля/etc. объекта в Python?
vars()
близок к тому, что я хочу, но он не работает, если у объекта нет __dict__
, что не всегда верно (например, это неверно для a list
, a dict
, и др.).
Есть ли способ получить все атрибуты/методы/поля/etc. объекта в Python?
vars()
близок к тому, что я хочу, но он не работает, если у объекта нет __dict__
, что не всегда верно (например, это неверно для a list
, a dict
, и др.).
Используйте встроенную функцию dir()
.
Что вы, возможно, хотите, это dir()
.
Ловушка заключается в том, что классы могут переопределять специальный метод __dir__
, который заставляет dir()
возвращать все, что хочет класс (хотя им рекомендуется возвращать точный список, это не применяется). Кроме того, некоторые объекты могут реализовать динамические атрибуты, переопределяя __getattr__
, могут быть прокси-объектами RPC или могут быть экземплярами классов C-расширения. Если ваш объект является одним из этих примеров, у них может не быть __dict__
или он может предоставить полный список атрибутов через __dir__
: у многих из этих объектов может быть так много динамических аттрибутов, которые он не знает на самом деле что у него есть, пока вы не попытаетесь получить к нему доступ.
В краткосрочном периоде, если dir()
недостаточно, вы можете написать функцию, которая пересекает __dict__
для объекта, а затем __dict__
для всех классов в obj.__class__.__mro__
; хотя это будет работать только для обычных объектов python. В конечном итоге вам, возможно, придется использовать утиную формулировку + предположения - если это похоже на утку, скрестите пальцы и надейтесь, что она имеет .feathers
.
Я использую __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'}
Вы можете использовать dir(your_object)
для получения атрибутов и getattr(your_object, your_object_attr)
для получения значений
использование:
for att in dir(your_object):
print (att, getattr(your_object,att))