Короткий ответ
Магические, или dunder (от double underscore), методы — специальные методы, имена которых начинаются и заканчиваются двумя подчёркиваниями: __init__, __str__, __eq__, __call__. Программист не вызывает их явно — их запускают встроенные функции и синтаксические конструкции языка.
Как это работает подробнее
Язык связывает операции с методами автоматически, поэтому, определив нужный метод, класс получает стандартное поведение.
- Неявный вызов.
len(obj)обращается к__len__(), оператор+— к__add__(), а оператор==— к__eq__(). - Основные методы.
__init__()инициализирует объект,__call__()делает экземпляр вызываемым как функцию, а__str__()и__repr__()задают строковые представления. - Разница str и repr.
__str__()возвращает человекочитаемое представление дляprint(), а__repr__()— однозначное официальное для отладки, по которому объект в идеале можно восстановить. - Запасной вариант. Если
__str__не определён,print()использует__repr__, поэтому хорошей практикой считается реализовать хотя бы__repr__.
Пример кода
Класс Point с набором dunder-методов
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self): # для разработчика/отладки
return f'Point({self.x}, {self.y})'
def __str__(self): # для пользователя
return f'({self.x}, {self.y})'
def __eq__(self, other): # поведение оператора ==
return self.x == other.x and self.y == other.y
def __call__(self): # экземпляр можно вызвать
return self.x + self.y
p = Point(1, 2)
print(str(p)) # (1, 2)
print(repr(p)) # Point(1, 2)
print(p == Point(1, 2)) # True
print(p()) # 3Что использовать на практике
- Минимум для своих классов. Реализуй как минимум
__repr__, чтобы объекты понятно выглядели при отладке и в логах. - Читаемое представление. Добавляй
__str__, когда пользователю нужно представление, отличное от официального. - Сравнение и сортировка. Определяй
__eq__и другие методы сравнения, чтобы объекты корректно сравнивались между собой.
Подводные камни
- Забытый __repr__. Без него объект выводится как
<__main__.Point object at 0x...>, что бесполезно при отладке. - Прямые вызовы. Вызывать магические методы напрямую — плохой стиль; для этого существуют встроенные функции и операторы.
- Путаница str и repr. Если представление для пользователя совпадает с отладочным, методы дублируют друг друга, но их назначение разное.
Как отвечать на собеседовании
- Начни с определения: dunder-методы — специальные методы с двойным подчёркиванием, которые язык вызывает автоматически → перечисли примеры вроде
__init__и__eq__→ разъясни разницу__str__и__repr__→ приведи пример класса Point с реализацией нескольких таких методов.