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

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

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


person user541686    schedule 30.07.2011    source источник
comment
Для получения атрибутов объекта attrs существует __attrs_attrs__.   -  person user202729    schedule 29.01.2021


Ответы (4)


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

person mouad    schedule 30.07.2011
comment
обратите внимание, что поведением dir() часто манипулируют, чтобы показать интересные атрибуты, а не только все; например, он не показывает атрибуты, унаследованные через метакласс, или он может быть переопределен с помощью метода __dir__. - person SingleNegationElimination; 31.07.2011
comment
@TokenMacGuy: Это нормально для того, что мне нужно ... слишком много размышлений об этом вызовет у меня головную боль. ;) - person user541686; 31.07.2011
comment
Он также не отображает свойства самоанализа, такие как func_defaults. - person fluffy; 18.08.2015
comment
@mouad, зачем мне это? ›› dir (pyrenderdoc) IronPython.Runtime.List? - person Mona Jalal; 30.12.2016

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

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

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

person Eli Collins    schedule 30.07.2011
comment
что, если я хочу сохранить результаты, возвращаемые dir ()? - person thewhitetulip; 26.03.2014
comment
Не уверен, что это то, что вы ищете, но ... attrs = dir(obj) сохранит массив атрибутов в виде строк в attrs. Затем, чтобы получить к ним доступ, вы всегда можете использовать getattr(obj, attrs[i]), чтобы получить атрибут ith в массиве attrs. - person Nick Merrill; 27.06.2014
comment
__dict__ эта функция мне очень помогла. - person Zhang LongQI; 11.05.2016

Я использую __dict__ и dir(<instance>)

Пример:

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

obj = MyObj()
print(obj.__dict__)
print(dir(obj))

# Output:  
# obj.__dict__ --> {'phone': '+6661', 'name': 'Chuck Norris'}
#
# dir(obj)     --> ['__class__', '__delattr__', '__dict__', '__doc__',
#               '__format__', '__getattribute__', '__hash__', 
#               '__init__', '__module__', '__new__', '__reduce__', 
#               '__reduce_ex__', '__repr__', '__setattr__', 
#               '__sizeof__', '__str__', '__subclasshook__', 
#               '__weakref__', 'name', 'phone']
person Slipstream    schedule 08.09.2016
comment
OP специально упоминает, что его интересуют случаи, когда нет __dict__ - иначе он мог бы использовать vars - person strubbly; 08.09.2016
comment
vars () близок к тому, что я хочу, но он не работает, если объект не имеет dict, что не всегда верно (например, это неверно для списка, dict и т. д. ). он четко сказал, что это НЕ то, что он хочет - person legend-is-back; 07.08.2017

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

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

for att in dir(your_object):
    print (att, getattr(your_object,att))
person Jason Angel    schedule 17.12.2018
comment
Спасибо, это то, что я давно ищу - person Cornea Valentin; 17.10.2019
comment
for attr in dir(obj): print(attr +'()') if callable(getattr(obj, attr)) else print(attr) # Скобки выводятся сразу после любых вызываемых объектов (функций, методов, классов и т. Д.) - person veganaiZe; 02.03.2020
comment
Кстати, это форматирование print(f'{att} : {getattr(myobject,att)}\n') может помочь вам лучше читать ваш вывод - person Jason Angel; 15.08.2020
comment
attribs = lambda obj: [o for o in dir (obj) if not o.startswith ('_')] у меня отлично работает. - person theo olsthoorn; 12.11.2020