
В Python доступ к атрибутам класса можно получить несколькими методами. Основной инструмент – функция dir(), которая возвращает список всех атрибутов объекта, включая методы и встроенные свойства. Для фильтрации только пользовательских атрибутов можно сочетать dir() с функцией getattr(), проверяя, что значение не является методом.
Если требуется получить только данные класса без методов, удобно использовать __dict__. Этот атрибут хранит словарь, где ключи – имена атрибутов, а значения – их текущие значения. Для классов с наследованием стоит учитывать, что __dict__ возвращает только атрибуты текущего класса, а атрибуты родительских классов можно получить через обход mro().
Для динамического анализа можно применять функцию vars(), которая возвращает словарь атрибутов объекта или класса. В отличие от __dict__, vars() работает корректно с объектами, реализующими методы __slots__, и позволяет безопасно модифицировать атрибуты без изменения структуры класса.
При программной проверке наличия атрибута используется функция hasattr(), а для получения значения – getattr() с возможностью задания значения по умолчанию. Такой подход эффективен для классов с динамическими или опциональными атрибутами, особенно при автоматической генерации данных или при работе с API.
Использование функции dir() для просмотра всех атрибутов класса
Функция dir() возвращает список имен всех атрибутов и методов объекта, включая унаследованные. Для класса это означает полный обзор всех доступных атрибутов, как пользовательских, так и встроенных.
Пример использования: dir(MyClass). Результатом будет список строк с именами методов и свойств класса. Это полезно для анализа структуры класса без необходимости читать весь код.
Функция dir() включает магические методы (начинающиеся и заканчивающиеся на двойное подчеркивание), обычные методы, свойства и атрибуты класса. Чтобы отфильтровать только пользовательские атрибуты, можно использовать генератор списка с условием: [a for a in dir(MyClass) if not a.startswith('__')].
Для экземпляров классов dir(instance) покажет не только атрибуты самого объекта, но и унаследованные из класса, что позволяет быстро проверять доступность методов и данных без обращения к документации.
В сочетании с функциями getattr() и hasattr(), dir() позволяет динамически взаимодействовать с классом: проверять наличие атрибута и получать его значение программно.
Использование dir() рекомендуется при отладке, динамическом создании объектов и анализе сторонних библиотек, где структура класса неизвестна заранее.
Получение только пользовательских атрибутов через __dict__
В Python атрибуты экземпляра класса хранятся в словаре __dict__. Этот словарь содержит только те свойства, которые были явно заданы пользователем, исключая методы, встроенные атрибуты и наследуемые свойства.
Для получения пользовательских атрибутов достаточно обратиться к instance.__dict__. Например:
class MyClass:
attr1 = 10
def __init__(self, value):
self.custom = value
Экземпляр:
obj = MyClass(42)
print(obj.__dict__) # {‘custom’: 42}
В данном случае __dict__ возвращает только ‘custom’, игнорируя attr1, так как оно является атрибутом класса.
Если нужно получить только имена пользовательских атрибутов, можно использовать obj.__dict__.keys(), а для значений – obj.__dict__.values(). Для фильтрации по типу данных или дополнительным условиям удобно применять генераторы словарей:
user_attrs = {k: v for k, v in obj.__dict__.items() if isinstance(v, int)}
Таким образом, __dict__ позволяет точно отделить динамически добавленные свойства экземпляра от статических атрибутов класса, обеспечивая контроль и манипуляцию только пользовательскими данными.
Фильтрация методов и свойств от обычных атрибутов

В Python атрибуты класса включают методы, свойства и переменные экземпляра. Для отделения методов и свойств от обычных атрибутов используют встроенные функции и модули: callable(), isinstance(), inspect.
Методы определяются как вызываемые объекты. Проверка выполняется через callable(getattr(Класс, 'имя_атрибута')). Это позволяет исключить из списка обычные данные, оставляя только функции и методы.
Свойства, создаваемые через @property, не являются callable, но принадлежат классу property. Для фильтрации используют isinstance(getattr(Класс, 'имя_атрибута'), property).
Модуль inspect позволяет получить детализированную информацию. inspect.isfunction() и inspect.ismethod() различают обычные функции и методы экземпляра. inspect.getmembers(Класс, predicate) возвращает пары (имя, объект) по заданной проверке, что удобно для выборочной фильтрации.
Пример фильтрации всех методов и свойств:
import inspect
атрибуты = inspect.getmembers(Класс)
методы = [name for name, obj in атрибуты if inspect.isfunction(obj) or inspect.ismethod(obj)]
свойства = [name for name, obj in атрибуты if isinstance(obj, property)]
Такой подход гарантирует точное отделение вызываемых объектов и дескрипторов property от обычных переменных, без захвата лишних элементов, таких как строки или числа.
Получение атрибутов экземпляра класса через getattr()

Функция getattr() позволяет динамически получать значение атрибута экземпляра класса по его имени в виде строки. Синтаксис: getattr(объект, "имя_атрибута", значение_по_умолчанию). Если атрибут существует, возвращается его текущее значение; если отсутствует – возвращается значение по умолчанию, если оно указано, иначе возникает AttributeError.
Пример использования:
class Car:
def __init__(self, model, year):
self.model = model
self.year = year
my_car = Car("Tesla", 2025)
model_value = getattr(my_car, "model") # возвращает "Tesla"
color_value = getattr(my_car, "color", "не указан") # возвращает "не указан"
Для обхода всех атрибутов экземпляра можно использовать комбинацию dir() и getattr(), фильтруя методы и магические атрибуты через проверку типа:
for attr in dir(my_car):
if not attr.startswith("__") and not callable(getattr(my_car, attr)):
print(attr, getattr(my_car, attr))
Этот подход позволяет получить только данные атрибуты без функций и встроенных методов.
При использовании getattr() важно учитывать наследуемые атрибуты. Если атрибут определен в родительском классе, функция корректно вернет его значение для экземпляра дочернего класса.
Рекомендации:
- Всегда указывайте значение по умолчанию, если не уверены в наличии атрибута, чтобы избежать исключений.
- Используйте
getattr()в комбинации сhasattr(), когда необходимо проверить существование атрибута перед доступом. - Для динамического обновления атрибутов сочетайте
getattr()сsetattr().
Проверка существования атрибута с помощью hasattr()
Функция hasattr(object, name) проверяет, присутствует ли атрибут с заданным именем в объекте или классе. Возвращает True, если атрибут существует, и False в противном случае.
Синтаксис:
hasattr(obj, 'атрибут')
Примеры использования:
- Проверка атрибута экземпляра:
class Person:
name = "Иван"
p = Person()
print(hasattr(p, 'name')) # True
print(hasattr(p, 'age')) # False
print(hasattr(Person, 'name')) # True
print(hasattr(Person, 'age')) # False
getattr() для безопасного получения значения:if hasattr(p, 'name'):
value = getattr(p, 'name')
else:
value = 'Атрибут отсутствует'
Рекомендации:
- Использовать
hasattr()перед динамическим доступом к атрибутам. - Не применять для проверки методов с одинаковым именем в подклассах – проверяется только существование имени.
- Для приватных атрибутов (с двумя подчёркиваниями) учитывать манглинг имён Python.
Функция hasattr() эффективна для безопасного управления атрибутами, особенно при работе с внешними библиотеками или динамическими структурами данных.
Различие между атрибутами класса и экземпляра
Атрибуты класса определяются в теле класса и доступны всем его экземплярам. Они хранятся в словаре класса __dict__ и разделяются между объектами, что позволяет экономить память при хранении одинаковых значений.
Атрибуты экземпляра создаются внутри методов, чаще всего в __init__, и принадлежат конкретному объекту. Их значения независимы от других экземпляров.
| Характеристика | Атрибут класса | Атрибут экземпляра |
|---|---|---|
| Место хранения | Класс __dict__ |
Экземпляр __dict__ |
| Общий доступ | Все экземпляры видят одно значение | Каждый экземпляр имеет своё значение |
| Изменение | Меняет значение для всех экземпляров (если не переопределён в экземпляре) | Меняет только для конкретного объекта |
| Применение | Константы, настройки по умолчанию | Данные, уникальные для объекта |
Рекомендации: используйте атрибуты класса для неизменяемых данных и общих конфигураций. Атрибуты экземпляра применяйте для хранения состояния конкретного объекта. Для проверки, является ли атрибут классом или экземпляром, можно использовать hasattr(obj, 'атрибут') и type(obj.__class__.__dict__.get('атрибут')).
Перебор всех атрибутов с их значениями с использованием vars()

Функция vars() возвращает словарь атрибутов объекта или класса с их текущими значениями. Для классов это позволяет динамически получить список всех переменных экземпляра, включая те, которые были добавлены после создания объекта.
Пример использования для экземпляра класса:
class Example:
def __init__(self, x, y):
self.x = x
self.y = y
obj = Example(10, 20)
for attr, value in vars(obj).items():
print(f»{attr}: {value}»)
Результат:
x: 10
y: 20
Для класса vars(Example) возвращает словарь атрибутов класса, включая методы, свойства и статические переменные. Это позволяет быстро анализировать структуру класса без обхода всех элементов через dir(), что удобно при рефакторинге и динамической генерации документации.
Если требуется фильтровать только переменные экземпляра, рекомендуется проверять тип значений или исключать методы через callable(). Например:
for attr, value in vars(obj).items():
if not callable(value):
print(f»{attr}: {value}»)
Использование vars() эффективно при автоматическом логировании состояния объектов, сериализации в JSON и при отладке сложных структур, где количество атрибутов заранее неизвестно.
Вопрос-ответ:
Каким образом можно получить список всех атрибутов класса в Python?
В Python для получения атрибутов класса чаще всего используют встроенную функцию dir(). Она возвращает список всех свойств и методов объекта, включая наследуемые. Если необходимо получить только атрибуты, определённые непосредственно в классе, без методов родительских классов, можно обратиться к словарю __dict__ класса, который хранит пары «имя: значение» для всех атрибутов и методов.
Как отличить методы от обычных переменных класса?
После получения списка атрибутов через dir() или __dict__, можно проверить тип каждого элемента с помощью функции callable(). Если атрибут вызываемый (т.е. можно применить круглые скобки, например obj.method()), это метод. Обычные переменные класса не вызываются и имеют типы вроде int, str или list. Это позволяет отделять функциональные части класса от данных.
Можно ли получить только публичные атрибуты класса без скрытых и специальных?
Да, для этого после получения всех атрибутов класса через dir() или __dict__ обычно фильтруют элементы, имена которых не начинаются и не заканчиваются двойным подчеркиванием __. Такие атрибуты считаются приватными или системными. В результате остаются только обычные переменные и методы, которые разработчик создавал для работы с объектами класса.
Какая разница между получением атрибутов экземпляра и самого класса?
Атрибуты экземпляра объекта хранятся в его __dict__ и могут отличаться от атрибутов класса. Класс определяет общие свойства и методы для всех экземпляров, но отдельный объект может иметь собственные значения, добавленные после создания. Если обращаться к атрибутам через сам класс, вы увидите только то, что объявлено на уровне класса, без изменений, сделанных в конкретных экземплярах.
