← Назад к вопросам

Что такое магические (dunder) методы?

1.3 Junior🔥 231 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Магические (dunder) методы

Магические методы — это специальные методы Python с двойными подчёркиваниями с обеих сторон названия (от double underscore — dunder). Они определяют поведение объектов при взаимодействии с встроенными функциями и операторами.

Основные магические методы

Инициализация и финализация

  • __init__ — конструктор, вызывается при создании объекта
  • __new__ — создание нового экземпляра класса (до __init__)
  • __del__ — деструктор, вызывается при удалении объекта

Представление объекта

  • __str__ — строковое представление для пользователя (вызывается str() и print())
  • __repr__ — полное представление для разработчика (вызывается repr())

Арифметические операции

  • __add__ — сложение (+)
  • __sub__ — вычитание (-)
  • __mul__ — умножение (*)
  • __truediv__ — деление (/)
  • __floordiv__ — целочисленное деление (//)
  • __mod__ — остаток от деления (%)

Сравнение

  • __eq__ — равенство (==)
  • __ne__ — неравенство (!=)
  • __lt__ — меньше (<)
  • __le__ — меньше или равно (<=)
  • __gt__ — больше (>)
  • __ge__ — больше или равно (>=)

Работа с контейнерами

  • __len__ — длина объекта (len())
  • __getitem__ — доступ к элементу по индексу (obj[key])
  • __setitem__ — установка элемента (obj[key] = value)
  • __delitem__ — удаление элемента (del obj[key])
  • __contains__ — проверка принадлежности (in)
  • __iter__ — создание итератора
  • __next__ — следующий элемент в итераторе

Вызываемость

  • __call__ — позволяет вызывать объект как функцию

Контекстные менеджеры

  • __enter__ — вход в блок with
  • __exit__ — выход из блока with

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

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"
    
    def __repr__(self):
        return f"Vector(x={self.x}, y={self.y})"
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    def __len__(self):
        return 2

v1 = Vector(3, 4)
v2 = Vector(1, 2)

print(str(v1))        # Vector(3, 4)
print(repr(v1))       # Vector(x=3, y=4)
print(v1 + v2)        # Vector(4, 6)
print(v1 == v2)       # False
print(len(v1))        # 2
class Counter:
    def __init__(self, start=0):
        self.count = start
    
    def __call__(self, increment=1):
        self.count += increment
        return self.count
    
    def __lt__(self, other):
        return self.count < other.count

counter = Counter()
print(counter())      # 1
print(counter(5))     # 6

other = Counter(10)
print(counter < other)  # True

Практическое применение

Магические методы используются для:

  1. Перегрузки операторов — сделать объекты работающими с +, -, * и т.д.
  2. Интеграции с встроенными функциями — поддержка len(), str(), iter()
  3. Повышения удобства использования — класс ведёт себя как встроенный тип
  4. Реализации протоколов — контекстные менеджеры, итераторы, вызываемые объекты

Понимание магических методов критично для написания pythonic-кода и создания удобных интерфейсов классов.

Что такое магические (dunder) методы? | PrepBro