Есть ли способ получить список атрибутов, которые существуют в экземплярах класса?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Желаемый результат заключается в том, что «multi, str» будет выводиться. Я хочу, чтобы это видеть текущие атрибуты из различных частей скрипта.
python
class
python-3.x
MadSc13ntist
источник
источник
NewClass
. Вы можете бросить вызов ожиданиям людей, если будете использовать соглашение об именах, напримерnew_class
.help()
функция помогает получать информацию о классах, функциях, встроенных функциях, модулях и т. Д.Ответы:
Вы также можете найти pprint полезным.
источник
pprint.pprint(a.__dict__)
делает симпатичный отпечаток на атрибутах.pprint
это не работает на Python 2.6.Затем вы можете проверить, какой тип с
type()
или с методомcallable()
.источник
boston
доставляла мне все доступные атрибуты в наборе данных из sklearn -__dict__
была пуста, когда на самом деле было 5 доступных атрибутовvars(obj)
возвращает атрибуты объекта.источник
Все предыдущие ответы верны, у вас есть три варианта того, что вы спрашиваете
dir()
vars()
__dict__
источник
vars(foo)
возвращаетсяfoo.__dict__
Это, конечно, напечатает любые методы или атрибуты в определении класса. Вы можете исключить «частные» методы путем изменения
i.startwith('__')
вi.startwith('_')
источник
Модуль проверки обеспечивает простые способы проверки объекта:
Используя
getmembers()
вы можете увидеть все атрибуты вашего класса, а также их значение. Для исключения приватных или защищенных атрибутов используйте.startswith('_')
. Чтобы исключить методы или функции, используйтеinspect.ismethod()
илиinspect.isfunction()
.Обратите внимание, что
ismethod()
используется для второго элемента,i
так как первый - это просто строка (его имя).Оффтоп: используйте CamelCase для имен классов.
источник
Вы можете использовать,
dir(your_object)
чтобы получить атрибуты иgetattr(your_object, your_object_attr)
получить значенияиспользование :
Это особенно полезно, если у вашего объекта нет __dict__. Если это не так, вы можете попробовать var (your_object) также
источник
Часто упоминается, что для получения полного списка атрибутов вы должны использовать
dir()
. Однако обратите внимание, что вопреки распространенному мнениюdir()
, не выявляет все атрибуты. Например, вы можете заметить, что__name__
может отсутствовать вdir()
списке класса, даже если вы можете получить к нему доступ из самого класса. Из документаdir()
( Python 2 , Python 3 ):Функция как ниже имеет тенденцию быть более полным, хотя нет никакой гарантии полноты , так как список возвращенного
dir()
может зависеть от многих факторов , в том числе реализации__dir__()
методы, или настройке__getattr__()
или__getattribute__()
на классе или одного из его родителей. Смотрите предоставленные ссылки для более подробной информации.источник
Зачем тебе это? Может быть трудно получить лучший ответ, не зная вашего точного намерения.
Почти всегда лучше делать это вручную, если вы хотите отобразить экземпляр вашего класса особым образом. Это будет включать именно то, что вы хотите, а не то, что вы не хотите, и порядок будет предсказуемым.
Если вы ищете способ отображения содержимого класса, вручную отформатируйте атрибуты, которые вас интересуют, и предоставьте это как метод
__str__
или__repr__
для вашего класса.Если вы хотите узнать, какие методы существуют для объекта, чтобы понять, как он работает, используйте
help
.help(a)
покажет вам форматированный вывод о классе объекта на основе его строк документации.dir
существует для программного получения всех атрибутов объекта. (Доступ -__dict__
это то, что я бы сгруппировал как то же самое, но я бы не использовал сам.) Однако это может не включать в себя то, что вы хотите, и это может включать в себя то, что вы не хотите. Это ненадежно, и люди думают, что хотят этого гораздо чаще, чем хотят.На некотором ортогональном примечании, в настоящее время очень мало поддержки Python 3. Если вы заинтересованы в написании реального программного обеспечения, вам понадобятся сторонние материалы, такие как numpy, lxml, Twisted, PIL или любое количество веб-фреймворков, которые еще не поддерживают Python 3 и не планируют делать это слишком рано. Различия между 2.6 и веткой 3.x невелики, но разница в поддержке библиотек огромна.
источник
Существует несколько способов сделать это:
При запуске этот код выдает:
источник
Пожалуйста, посмотрите скрипт оболочки Python, который был выполнен последовательно, здесь вы получите атрибуты класса в строковом формате, разделенные запятой.
Я использую Python 3.4
источник
a.__dict__.keys()
. Однако, если вы хотите знать, имеет ли объект определенный атрибут, который вы можете использоватьhasattr
.В дополнение к этим ответам я включу функцию (python 3) для выдачи практически всей структуры любого значения. Он использует
dir
для создания полного списка имен свойств, а затем используетgetattr
с каждым именем. Он отображает тип каждого элемента значения и, когда возможно, также отображает весь элемент:Теперь любое из следующего должно дать понимание:
источник
Получить атрибуты объекта
Вывод
источник
Как написано перед использованием,
obj.__dict__
можно обрабатывать общие случаи, но некоторые классы не имеют__dict__
атрибута и использования__slots__
(в основном для эффективности памяти).пример более гибкого способа сделать это:
вывод этого кода:
Примечание 1:
Python - это динамический язык, и всегда лучше знать классы, от которых вы пытаетесь получить атрибуты, поскольку даже этот код может пропустить некоторые случаи.
Примечание 2:
этот код выводит только переменные экземпляра, то есть переменные класса не предоставляются. например:
кодовые выходы:
Этот код не печатает
url
атрибут класса и может пропустить требуемые атрибуты класса.Иногда мы можем думать, что атрибут является членом экземпляра, но это не так и не будет показано в этом примере.
источник
__dict__
и__slots__
, так что вы, вероятно, хотите попробовать оба, а не просто диктат.__dict__
илиvars
не работает, потому что он пропускает__slots__
.__dict__
и__slots__
не работает, потому что он пропускает__slots__
из базовых классов.dir
не работает, поскольку оно включает атрибуты класса, такие как методы или свойства, а также атрибуты объекта.vars
эквивалентно использованию__dict__
.Это лучшее, что у меня есть:
источник
источник
Пожалуйста, посмотрите следующее выполнение сценариев оболочки Python последовательно, это даст решение от создания класса до извлечения имен полей экземпляров.
источник
__attr__
дает список атрибутов экземпляра.источник
__attr__
в описании, но используете__attrs__
в коде. Ни один из них не работал для меня (werkzeug.datastructures.FileStorage)