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, следуя принципу «меньшего удивления».