Получить все атрибуты объекта в Python?
есть ли способ сделать все атрибуты / методы / поля / etc. объекта в Python?
vars() is закрыть к тому, что я хочу, но он не работает, если объект не имеет __dict__ , которые не всегда верно (например, это не верно для list , a dict , etc.).
3 ответов
используйте встроенную функцию dir() .
что вы, вероятно, хотите-это dir() .
загвоздка в том, что классы могут переопределить специальный __dir__ метод, который вызывает dir() чтобы вернуть все, что хочет класс (хотя им предлагается вернуть точный список, это не применяется). Кроме того, некоторые объекты могут реализовывать динамические атрибуты путем переопределения __getattr__ , могут быть объектами прокси RPC или экземплярами классов C-extension. Если ваш объект является одним из этих примеров, они могут нет __dict__ или иметь возможность предоставить полный список атрибутов через __dir__ : многие из этих объектов могут иметь так много динамических attrs, что на самом деле не будут знать что он имеет, пока вы не попытаетесь получить к нему доступ.
в краткосрочной перспективе, если dir() недостаточно, вы можете написать функцию, которая пересекает __dict__ для объекта __dict__ для всех классов в obj.__class__.__mro__ , хотя это будет работать только для обычных объектов Python. В долгом run, возможно, вам придется использовать duck typing + предположения — если он выглядит как утка, скрестите пальцы и надейтесь, что он .feathers .
Список полей в объекте
Я получаю некий объект с неизвестными для меня полями. Есть ли какой-нибудь способ стандартными средствами Python посмотреть список полей данного объекта ?
Штатный: dir(obj) Кроме того, часто полезно явно запросить тип: type(obj)
![]()
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python python-2.x или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Класс и объект в Python
Python — это процедурно-ориентированный и одновременно объектно-ориентированный язык программирования.
Процедурно-ориентированный
«Процедурно-ориентированный» подразумевает наличие функций. Программист может создавать функции, которые затем используются в сторонних скриптах.
Объектно-ориентированный
«Объектно-ориентированный» подразумевает наличие классов. Есть возможность создавать классы, представляющие собой прототипы для будущих объектов.
Создание класса в Python
Синтаксис для написания нового класса:
- Для создания класса пишется ключевое слово class , его имя и двоеточие (:). Первая строчка в теле класса описывает его. (По желанию) получить доступ к этой строке можно с помощью ClassName.__doc__
- В теле класса допускается объявление атрибутов, методов и конструктора.
Атрибут:
Атрибут — это элемент класса. Например, у прямоугольника таких 2: ширина ( width ) и высота ( height ).
Метод:
- Метод класса напоминает классическую функцию, но на самом деле — это функция класса. Для использования ее необходимо вызывать через объект.
- Первый параметр метода всегда self (ключевое слово, которое ссылается на сам класс).
Конструктор:
- Конструктор — уникальный метод класса, который называется __init__ .
- Первый параметр конструктора во всех случаях self (ключевое слово, которое ссылается на сам класс).
- Конструктор нужен для создания объекта.
- Конструктор передает значения аргументов свойствам создаваемого объекта.
- В одном классе всегда только один конструктор.
- Если класс определяется не конструктором, Python предположит, что он наследует конструктор родительского класса.
Создание объекта с помощью класса Rectangle:


Что происходит при создании объекта с помощью класса?
При создании объекта класса Rectangle запускается конструктор выбранного класса, и атрибутам нового объекта передаются значения аргументов. Как на этом изображении:

Конструктор с аргументами по умолчанию
В других языках программирования конструкторов может быть несколько. В Python — только один. Но этот язык разрешает задавать значение по умолчанию.
Все требуемые аргументы нужно указывать до аргументов со значениями по умолчанию.

Сравнение объектов
В Python объект, созданный с помощью конструктора, занимает реальное место в памяти. Это значит, что у него есть точный адрес.
Если объект AA — это просто ссылка на объект BB , то он не будет сущностью, занимающей отдельную ячейку памяти. Вместо этого он лишь ссылается на местоположение BB .

Оператор == нужен, чтобы узнать, ссылаются ли два объекта на одно и то же место в памяти. Он вернет True , если это так. Оператор != вернет True , если сравнить 2 объекта, которые ссылаются на разные места в памяти.

Атрибуты
В Python есть два похожих понятия, которые на самом деле отличаются:
- Атрибуты
- Переменные класса
Стоит разобрать на практике:
Атрибут
Объекты, созданные одним и тем же классом, будут занимать разные места в памяти, а их атрибуты с «одинаковыми именами» — ссылаться на разные адреса. Например:


Python умеет создавать новые атрибуты для уже существующих объектов. Например, объект player1 и новый атрибут address .
Встроенные атрибуты класса
Объекты класса — дочерние элементы по отношению к атрибутам самого языка Python. Таким образом они заимствуют некоторые атрибуты:
| Атрибут | Описание |
|---|---|
| __dict__ | Предоставляет данные о классе коротко и доступно, в виде словаря |
| __doc__ | Возвращает строку с описанием класса, или None , если значение не определено |
| __class__ | Возвращает объект, содержащий информацию о классе с массой полезных атрибутов, включая атрибут __name__ |
| __module__ | Возвращает имя «модуля» класса или __main__ , если класс определен в выполняемом модуле. |
Переменные класса
Переменные класса в Python — это то же самое, что Field в других языках, таких как Java или С#. Получить к ним доступ можно только с помощью имени класса или объекта.
Для получения доступа к переменной класса лучше все-таки использовать имя класса, а не объект. Это поможет не путать «переменную класса» и атрибуты.

У каждой переменной класса есть свой адрес в памяти. И он доступен всем объектам класса.
Составляющие класса или объекта
В Python присутствует функция dir , которая выводит список всех методов, атрибутов и переменных класса или объекта.