Что такое служебный атрибут __dict__ в Python?

«Что такое служебный атрибут __dict__ в Python?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

__dict__ — это специальный атрибут, который хранит изменяемое пространство имен объекта в виде словаря. В нем содержатся атрибуты экземпляра класса.

Пример использования:

class Project:
    def __init__(self, name, priority):
        self.name = name
        self.priority = priority
        self.status = 'active'

project = Project('API Migration', 'high')

# __dict__ содержит атрибуты экземпляра
print(project.__dict__)
# Вывод: {'name': 'API Migration', 'priority': 'high', 'status': 'active'}

# Динамическое изменение атрибутов через __dict__
project.__dict__['deadline'] = '2024-12-01'
print(project.deadline)  # 2024-12-01

# Удаление атрибута
del project.__dict__['status']

Важные детали:

  • Для экземпляров: obj.__dict__ хранит атрибуты, назначенные через self.attr или динамически.
  • Для классов: ClassName.__dict__ хранит атрибуты класса, включая методы (он является более сложным объектом mappingproxy).
  • Ограничения: Объекты, классы которых определяют __slots__, не имеют атрибута __dict__ для экономии памяти. Также его нет у многих встроенных типов (например, list, int).
  • Применение: Часто используется для сериализации, интроспекции (например, в ORM) или динамического управления атрибутами.