Получить все атрибуты объекта в Python? - PullRequest
301 голосов
/ 31 июля 2011

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

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

Ответы [ 4 ]

396 голосов
/ 31 июля 2011

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

70 голосов
/ 31 июля 2011

То, что вам, вероятно, нужно, это dir().

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

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

59 голосов
/ 08 сентября 2016

Я использую __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'}
11 голосов
/ 17 декабря 2018

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

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

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