Какие магические методы в 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 и позволяют кастомизировать поведение классов для естественной интеграции с языком.