Короткий ответ
Магические, или 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