Какие магические методы в python знаешь
В Python магические методы (или dunder-методы, от "double underscore") — это специальные методы, имена которых начинаются и заканчиваются двумя подчёркиваниями, например init, str, add. Эти методы позволяют переопределять стандартное поведение объектов: создание, преобразование в строку, арифметические операции, сравнение, доступ к атрибутам и многое другое.
💡 Категории магических методов
1. Методы инициализации и создания объектов
- new(cls, ...)
Вызывается при создании нового экземпляра класса до init. Используется, если нужно контролировать сам процесс создания объекта (чаще при наследовании от неизменяемых типов, как int, str). - init(self, ...)
Инициализирует объект после его создания. Используется чаще всего для задания начальных значений. - del(self)
Вызывается перед уничтожением объекта. Используется для освобождения ресурсов, но не рекомендуется полагаться на него как на надёжный деструктор.
2. Представление объектов
- str(self)
Возвращает строку, которую видит пользователь при вызове print(obj). Пример: "User(name=Alex)". - repr(self)
Возвращает официальное строковое представление объекта, чаще — для разработчиков. Цель: eval(repr(obj)) == obj, если возможно. - bytes(self)
Преобразование в байтовую строку: bytes(obj). - format(self, format_spec)
Используется в форматировании строк: "{:10}".format(obj).
3. Операторы и арифметика
Арифметика:
- add(self, other) — +
- sub(self, other) — -
- mul(self, other) —
- truediv(self, other) — /
- floordiv(self, other) — //
- mod(self, other) — %
- pow(self, other) —
Обратные операторы:
- radd(self, other) — other + self, если other.add не реализован
- rmul, rsub и т.д.
Унарные операторы:
- neg(self) — -obj
- pos(self) — +obj
- abs(self) — abs(obj)
Побитовые:
- and, or, xor
- lshift, rshift
- Обратные: rand, ror, ...
4. Сравнение объектов
- eq(self, other) — ==
- ne(self, other) — !=
- lt(self, other) — <
- le(self, other) — <=
- gt(self, other) — >
- ge(self, other) — >=
5. Контейнеры и доступ к элементам
- len(self) — len(obj)
- getitem(self, key) — obj[key]
- setitem(self, key, value) — obj[key] = value
- delitem(self, key) — del obj[key]
- iter(self) — инициализация итерации: for x in obj
- next(self) — следующий элемент в итерации
- contains(self, item) — item in obj
- reversed(self) — reversed(obj)
- missing(self, key) — вызывается, если ключ не найден (в словарях)
6. Контекстные менеджеры
- enter(self)
Вызывается в начале блока with. - exit(self, exc_type, exc_val, exc_tb)
Вызывается в конце блока with. Используется для освобождения ресурсов.
7. Доступ к атрибутам
- getattr(self, name)
Вызывается, если атрибут не найден обычным способом. - getattribute(self, name)
Вызывается при любом доступе к атрибуту (в том числе существующему). - setattr(self, name, value)
Вызывается при попытке установки значения атрибута. - delattr(self, name)
Вызывается при удалении атрибута. - dir(self)
Используется для вывода списка доступных атрибутов (например, в dir(obj)).
8. Метаклассы и дескрипторы
- call(self, args, **kwargs)
Делает объект вызываемым, как функция: obj(). - instancecheck(self, instance)
Используется с isinstance(instance, Class) — переопределение поведения. - subclasscheck(self, subclass)
Для issubclass(subclass, Class).
9. Хеширование и булевы значения
- hash(self) — возвращает хеш объекта, нужен для использования в set и dict.
- bool(self) — логическое значение объекта (if obj:).
- int, float, complex — преобразование к числам.
Пример использования
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)
def repr(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Vector(4, 6)
Эти методы лежат в основе многих встроенных возможностей Python и позволяют кастомизировать поведение классов для естественной интеграции с языком.