Skip to content

Magic methods

Определение#

Магические методы (Magic methods) - это специальные методы в Python, которые начинаются и заканчиваются двойным подчёркиванием (например,__init__). Они также называются dunder‑методами (от англ. double underscore).

Зачем нужны#

Dunder methods (Магические методы) позволяют настроить поведение класса под стандартный синтаксис языка (операторы, сравнения, контейнеры, with)

С их помощью можно перегружать операторы (сложение, вычитание), настраивать строковое представление объекта, определять логику сравнения или превращать объект в итерируемую коллекцию.

По сути, они позволяют глубоко интегрировать пользовательские объекты в экосистему Python, делая код более элегантным и интуитивно понятным.

Основные категории#

Магические методы охватывают практически все аспекты поведения объектов.

Категория Методы Когда вызываются
Жизненный цикл __new__, __init__, __del__ Создание, инициализация и удаление объекта
Представление __str__, __repr__ Преобразование в строку (для пользователя и для отладки)
Математика __add__, __sub__, __mul__ Арифметические операции (+, -, *)
Сравнение __eq__, __lt__, __gt__ Сравнение объектов (==, <, >)
Контейнеры __len__, __getitem__, __iter__ Работа с длиной, индексами и циклами

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

Реализуем класс Vector, который умеет складываться с другим вектором через стандартный плюс.

    class Vector:
        def __init__(self, x, y):
            self.x = x
            self.y = y

        # Перегрузка оператора +
        def __add__(self, other):
            return Vector(self.x + other.x, self.y + other.y)

        # Красивый вывод при print()
        def __str__(self):
            return f"Vector({self.x}, {self.y})"

    v1 = Vector(1, 2)
    v2 = Vector(3, 4)
    v3 = v1 + v2
    print(v3)  # Выведет: Vector(4, 6)

Ключевые мысли#

  • Магические методы вызываются интерпретатором автоматически «под капотом» при выполнении соответствующих операций.
  • Никогда не вызывайте dunder‑методы напрямую (кроме редких случаев), используйте встроенные функции, такие как str(obj), len(obj) или операторы.
  • Реализация этих методов делает ваш API более согласованным с остальным кодом на Python, следуя принципу «меньшего удивления».