Встречается на 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 методов из разных категорий и показать пример на классе.
Похожие вопросы
- Почему стал заниматься Data Science28%
- Есть какие-то вопросы28%
- Какие подходы понижения размерности известны28%
- Расскажи о своём самом успешном проекте28%
- Какие у тебя есть вопросы24%
- Почему уволился с последнего места работы24%
- Какие знаешь метрики качества моделей бинарной классификации24%
- Какие у тебя зарплатные ожидания20%
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы
