Встречается на 28% собеседований по Data Engineer

Какие магические методы в python знаешь

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

Как это работает

Когда интерпретатор встречает выражение obj + other, он ищет у класса obj метод __add__ и вызывает его. Аналогично print(obj) использует __str__, len(obj)__len__, а obj[key]__getitem__. Это позволяет переопределять стандартное поведение для своих классов.

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

Инициализация и представление

  • __init__(self, ...) — конструктор, вызывается при создании объекта.
  • __del__(self) — деструктор, вызывается при удалении объекта.
  • __str__(self) — вызывается str() и print(), должен возвращать читаемое описание.
  • __repr__(self) — вызывается repr(), должен возвращать строку, по которой можно воссоздать объект.

Сравнения

  • __eq__(self, other) — оператор ==.
  • __ne__(self, other) — оператор !=.
  • __lt__(self, other) — оператор <.
  • __gt__(self, other) — оператор >.
  • __le__(self, other) — оператор <=.
  • __ge__(self, other) — оператор >=.

Арифметика

  • __add__(self, other) — оператор +.
  • __sub__(self, other) — оператор -.
  • __mul__(self, other) — оператор *.
  • __truediv__(self, other) — оператор /.
  • __floordiv__(self, other) — оператор //.
  • __mod__(self, other) — оператор %.
  • __pow__(self, other[, modulo]) — оператор **.

Контейнеры и последовательности

  • __len__(self) — вызывается len().
  • __getitem__(self, key) — доступ по индексу или ключу: obj[key].
  • __setitem__(self, key, value) — присваивание по индексу: obj[key] = value.
  • __delitem__(self, key) — удаление элемента: del obj[key].
  • __iter__(self) — возвращает итератор, используется в циклах for.
  • __contains__(self, item) — проверка вхождения, оператор in.

Прочие полезные методы

  • __call__(self, *args, **kwargs) — позволяет вызывать объект как функцию.
  • __enter__(self) и __exit__(self, exc_type, exc_value, traceback) — реализация контекстного менеджера для with.

Пример

python
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __str__(self):
        return f"{self.title} by {self.author}"

    def __repr__(self):
        return f'Book("{self.title}", "{self.author}")'

    def __eq__(self, other):
        return self.title == other.title and self.author == other.author

book1 = Book("War and Peace", "Leo Tolstoy")
book2 = Book("Anna Karenina", "Leo Tolstoy")

print(book1)      # вызывает __str__: War and Peace by Leo Tolstoy
repr(book1)       # вызывает __repr__: Book("War and Peace", "Leo Tolstoy")
book1 == book2    # вызывает __eq__, возвращает False

Подводные камни

  • __repr__ и __str__ часто путают: __repr__ должен быть однозначным для разработчика, __str__ — читаемым для пользователя.
  • Если не определить __eq__, сравнение объектов идёт по идентичности (адресу в памяти), что почти всегда не то, что нужно.
  • При переопределении __eq__ в Python 3 автоматически становится None метод __hash__, что делает объекты нехешируемыми. Если объекты нужны в качестве ключей словаря или элементов множества, определите __hash__.
  • Для арифметических операций есть «отражённые» версии (__radd__, __rsub__ и т.д.), которые вызываются, когда левый операнд не поддерживает операцию.

Коротко

  • Магические методы — это dunder-методы, определяющие поведение объектов для встроенных операций.
  • Основные группы: инициализация (__init__, __str__, __repr__), сравнения (__eq__, __lt__), арифметика (__add__, __mul__), контейнеры (__len__, __getitem__), вызов (__call__), контекст (__enter__, __exit__).
  • При переопределении __eq__ не забывайте про __hash__.
  • На собеседовании достаточно назвать 5–7 методов из разных категорий и показать пример на классе.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы