- Как получить список атрибутов классов в Python
- Примеры работы с классами в Python
- Создание классов
- Создание экземпляров класса
- Доступ к атрибутам
- Встроенные атрибуты класса
- Удаление объектов (сбор мусора)
- Наследование класса в python
- Синтаксис наследования класса
- Получить все атрибуты объекта в Python?
- 3 ответов
- Как мне посмотреть внутри объекта Python?
- Python — получение всех переменных класса
- 2 ответа 2
Как получить список атрибутов классов в Python
Получите практические, реальные навыки Python на наших ресурсах и пути
Автор: Mike Driscoll
Дата записи
На днях я пытался выяснить, был ли простой способ захватить определенные атрибуты класса (AKA »переменных экземпляров«). Причина заключалась в том, что мы использовали атрибуты, которые мы создали, чтобы сопоставить с полями в файле, который мы разбираем. Таким образом, мы прочитаем файловую строку, и каждая строка может быть разделена на 150+ штук, которые необходимо сопоставлять на поля, которые мы создаем в классе. Улов в том, что мы недавно добавили больше полей в класс, и есть чек в коде, который жестко закодирован с количеством полей, которые должны быть в файле. Таким образом, когда я добавил больше полей, он сломал чек. Я надеюсь, что все имеет смысл. Теперь вы знаете фон, поэтому мы можем двигаться дальше. Я нашел три разных способа достичь этого, поэтому мы отправимся от самого сложного до самой простой.
Поскольку большинство программистов Python должны знать, Python предоставляет удобный маленький встроенный встроенный Дир Отказ Я могу использовать это в экземпляре класса, чтобы получить список всех атрибутов и методов этого класса вместе с некоторыми унаследованными методами магии, таких как «__delattr__», ‘__dict__’, ‘__doc__’, ‘__Format__’ и т. Д. Вы можете Попробуйте это сами, делая следующее:
Однако я не хочу, чтобы магические методы, и я тоже не хочу методы. Я просто хочу атрибуты. Чтобы сделать все кристально чистые, давайте напишем какой-нибудь код!
То, что мы хотим получить, это список, который содержит только Self.varone, Self.Vartwo и Self.varthree. Первый метод, на котором мы рассмотрим, является использование модуля проверки Python.
Не выглядит слишком сложным, не делает это? Но это требует импорта, и я бы предпочел этого не делать. С другой стороны, если вам нужно сделать самоанализ, модуль проверки – отличный способ пойти. Это довольно мощно и может сказать вам много замечательных вещей о вашем классе или один, который вы даже не писали. Во всяком случае, следующий самый простой способ, которым я обнаружил, было использовать Python’s Callable Встроенный:
Вы можете прочитать больше о Callable в Python Документы Отказ В основном все, что Callable – возвращает истинный или ложный в зависимости от того, приоритет ли вы, который вы передали его. Методы Callable, переменные нет. Таким образом, мы связываемся над каждым элементом в классе Dict и только добавляем их к списку, если они не Callable (то есть не методы). Довольно Slick, и это не требует никакого импорта! Но есть еще проще!
Самый простой способ, которым я нашел, использовал магический метод, __dict__ Отказ Это встроено в каждый класс, который вы делаете, если вы не переопределите его. Поскольку мы имеем дело с словарем Python, мы можем просто называть его Ключи Способ!
Настоящий вопрос сейчас, если вы используете магический метод для этого? Большинство Python Programmer, вероятно, нахмурится на него. Они волшебные, поэтому они не должны использоваться, если вы не делаете MetaProgramming. Лично я думаю, что это совершенно приемлемо для этого случая использования. Дайте мне знать о любых других методах, которые я пропустил или что, по вашему мнению, лучше.
Источник
Примеры работы с классами в Python
Python — объектно-ориентированный язык с начала его существования. Поэтому, создание и использование классов и объектов в Python просто и легко. Эта статья поможет разобраться на примерах в области поддержки объектно-ориентированного программирования Python. Если у вас нет опыта работы с объектно-ориентированным программированием (OOП), ознакомьтесь с вводным курсом или учебным пособием, чтобы понять основные понятия.
Создание классов
Оператор class создает новое определение класса. Имя класса сразу следует за ключевым словом class , после которого ставиться двоеточие:
- У класса есть строка документации, к которой можно получить доступ через ClassName.__doc__ .
- class_suite состоит из частей класса, атрибутов данных и функции.
Пример создания класса на Python:
- Переменная emp_count — переменная класса, значение которой разделяется между экземплярами этого класса. Получить доступ к этой переменной можно через Employee.emp_count из класса или за его пределами.
- Первый метод __init__() — специальный метод, который называют конструктором класса или методом инициализации. Его вызывает Python при создании нового экземпляра этого класса.
- Объявляйте другие методы класса, как обычные функции, за исключением того, что первый аргумент для каждого метода self . Python добавляет аргумент self в список для вас; и тогда вам не нужно включать его при вызове этих методов.
Создание экземпляров класса
Чтобы создать экземпляры классов, нужно вызвать класс с использованием его имени и передать аргументы, которые принимает метод __init__ .
Доступ к атрибутам
Получите доступ к атрибутам класса, используя оператор . после объекта класса. Доступ к классу можно получить используя имя переменой класса:
Теперь, систематизируем все.
При выполнении этого кода, мы получаем следующий результат:
Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любой момент.
Вместо использования привычных операторов для доступа к атрибутам вы можете использовать эти функции:
- getattr(obj, name [, default]) — для доступа к атрибуту объекта.
- hasattr(obj, name) — проверить, есть ли в obj атрибут name .
- setattr(obj, name, value) — задать атрибут. Если атрибут не существует, он будет создан.
- delattr(obj, name) — удалить атрибут.
Встроенные атрибуты класса
Каждый класс Python хранит встроенные атрибуты, и предоставляет к ним доступ через оператор . , как и любой другой атрибут:
- __dict__ — словарь, содержащий пространство имен класса.
- __doc__ — строка документации класса. None если, документация отсутствует.
- __name__ — имя класса.
- __module__ — имя модуля, в котором определяется класс. Этот атрибут __main__ в интерактивном режиме.
- __bases__ — могут быть пустые tuple, содержащие базовые классы, в порядке их появления в списке базового класса.
Для вышеуказанного класса давайте попробуем получить доступ ко всем этим атрибутам:
Когда этот код выполняется, он возвращает такой результат:
Удаление объектов (сбор мусора)
Python автоматически удаляет ненужные объекты (встроенные типы или экземпляры классов), чтобы освободить пространство памяти. С помощью процесса ‘Garbage Collection’ Python периодически восстанавливает блоки памяти, которые больше не используются.
Сборщик мусора Python запускается во время выполнения программы и тогда, когда количество ссылок на объект достигает нуля. С изменением количества обращений к нему, меняется количество ссылок.
Когда объект присваивают новой переменной или добавляют в контейнер (список, кортеж, словарь), количество ссылок объекта увеличивается. Количество ссылок на объект уменьшается, когда он удаляется с помощью del , или его ссылка выходит за пределы видимости. Когда количество ссылок достигает нуля, Python автоматически собирает его.
Обычно вы не заметите, когда сборщик мусора уничтожает экземпляр и очищает свое пространство. Но классом можно реализовать специальный метод __del__() , называемый деструктором. Он вызывается, перед уничтожением экземпляра. Этот метод может использоваться для очистки любых ресурсов памяти.
Пример работы __del__()
Деструктор __del__() выводит имя класса того экземпляра, который должен быть уничтожен:
Когда вышеуказанный код выполняется и выводит следующее:
В идеале вы должны создавать свои классы в отдельном модуле. Затем импортировать их в основной модуль программы с помощью import SomeClass .
Наследование класса в python
Наследование — это процесс, когда один класс наследует атрибуты и методы другого. Класс, чьи свойства и методы наследуются, называют Родителем или Суперклассом. А класс, свойства которого наследуются — класс-потомок или Подкласс.
Вместо того, чтобы начинать с нуля, вы можете создать класс, на основе уже существующего. Укажите родительский класс в круглых скобках после имени нового класса.
Класс наследник наследует атрибуты своего родительского класса. Вы можете использовать эти атрибуты так, как будто они определены в классе наследнике. Он может переопределять элементы данных и методы родителя.
Синтаксис наследования класса
Классы наследники объявляются так, как и родительские классы. Только, список наследуемых классов, указан после имени класса.
Источник
Получить все атрибуты объекта в 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?
Я начинаю программировать в различных проектах с использованием Python (включая веб-разработку Django и разработку игр Panda3D).
Чтобы помочь мне понять, что происходит, я бы хотел «заглянуть» внутрь объектов Python, чтобы увидеть, как они помечаются — как их методы и свойства.
Скажем, у меня есть объект Python, что мне нужно, чтобы распечатать его содержимое? Это вообще возможно?
Python обладает мощным набором функций для самоанализа.
type() и dir() особенно полезны для проверки типа объекта и его набора атрибутов соответственно.
Сначала прочитайте источник.
Во-вторых, используйте dir() функцию.
Я удивлен, что никто не упомянул помощь еще!
С помощью справки вы можете прочитать строку документации и получить представление о том, какие атрибуты может иметь класс, что очень полезно.
Если это для исследования, чтобы увидеть, что происходит, я бы порекомендовал посмотреть на IPython . Это добавляет различные ярлыки для получения объектов документации, свойств и даже исходного кода. Например, добавив «?» функция даст справку для объекта (по сути, ярлык для «help (obj)», когда используется два? ‘s (» func?? ») будет отображаться исходный код, если он доступен.
Есть также много дополнительных удобств, таких как завершение табуляции, удобная печать результатов, история результатов и т. Д., Которые делают его очень удобным для такого рода исследовательского программирования.
Для более программного использования интроспекции будут полезны базовые встроенные функции, такие как dir() , vars() и getattr т. Д., Но вам стоит потратить время на ознакомление с модулем проверки . Чтобы получить источник функции, используйте » inspect.getsource «, например, применив ее к себе:
inspect.getargspec также часто полезно, если вы имеете дело с обертыванием или манипулированием функциями, так как оно даст имена и значения по умолчанию параметров функции.
Если вы заинтересованы в GUI для этого, взгляните на objbrowser . Он использует модуль проверки из стандартной библиотеки Python для внутреннего анализа объекта.
Вы можете перечислить атрибуты объекта с помощью dir () в оболочке:
Другие уже упоминали встроенную функцию dir (), которая звучит как то, что вы ищете, но вот еще один хороший совет. Многие библиотеки, в том числе большая часть стандартной библиотеки, распространяются в виде исходного кода. Это означает, что вы можете довольно легко прочитать исходный код напрямую. Хитрость в том, чтобы найти это; например:
Файл * .pyc скомпилирован, поэтому удалите завершающий символ ‘c’ и откройте не скомпилированный файл * .py в вашем любимом редакторе или средстве просмотра файлов:
Я обнаружил, что это невероятно полезно для обнаружения таких вещей, как исключения, возникающие из данного API. Подобные детали редко хорошо документированы в мире Python.
Хотя pprint уже упоминалось другими, я хотел бы добавить некоторый контекст.
Модуль pprint предоставляет возможность «красиво распечатать» произвольные структуры данных Python в форме, которую можно использовать в качестве входных данных для интерпретатора. Если отформатированные структуры включают объекты, которые не являются основными типами Python, представление может быть не загружаемым. Это может быть в том случае, если включены такие объекты, как файлы, сокеты, классы или экземпляры, а также многие другие встроенные объекты, которые не могут быть представлены как константы Python.
pprint могут быть востребованы разработчиками с фоном PHP, которые ищут альтернативу var_dump() .
Объекты с атрибутом dict могут быть выгружены с помощью pprint() смешанного с vars() , который возвращает __dict__ атрибут для модуля, класса, экземпляра и т. Д .:
Чтобы вывести все переменные, содержащиеся в глобальной или локальной области, просто используйте:
locals() показывает переменные, определенные в функции.
Также полезно получить доступ к функциям с их соответствующим именем в виде строкового ключа, помимо прочего :
Аналогично, используется dir() для просмотра содержимого модуля или атрибутов объекта.
Источник
Python — получение всех переменных класса
Есть класс: class Class1():
Следующий класс: class Class2(Class1):
Затем, в тесте вызываю Class2:
В итоге t равно:
Подскажите, как получить?
В ответе, кроме упомянутых значений, также присутствуют такие парамтры как:
Было бы здорово избежать их появления
2 ответа 2
В python у классов есть есть атрибут __dict__ или метод vars(obj) они возвращают все переменные ОБЪЕКТА, это значит, сто если вы объявит ваши переменные в init как self.value1′ и ‘self.value2 , то при создании объекта класса Class1 на пример:
Для доступа к value1 напишите: a.dict [0] или a.dict [‘value1’]
А вообще, мне не понятен вопрос для доступа к полям есть оператор «.» Для доступа к дому полю или метод класса нужна написать его через точку например: a.value1 вернет
Вы видимо исправить эту конструкцию для КЛАССА а нужно для объекта, если выполнить данный код то все заработает : a = Class1() print(a.__dict__) В первой строке вы создаёте объект а восвторой для него вызываете метод dict который возвращает только переменные без всякого дишнего, (заметьте, что во второй строке после объекта «а» круглые скобки не нужны, ведь это и есть объект класса, а вот если вы вызовите Class1.__dict__ то получить как раз то что вы и получали с лишними полями docs, meta и т.п.
Источник