Магические (dunder) методы
Подключите свои классы к встроенному синтаксису Python
__str__ или __eq__, который Python вызывает за вас, когда вы используете обычный синтаксис: print(obj), a == b, len(obj) или a + b. Вы почти никогда не вызываете их по имени; вы их определяете, чтобы ваши объекты вели себя как встроенные типы.
- объяснить, что такое dunder-методы и когда Python их вызывает,
- придать объектам читаемый вид с помощью
__repr__и__str__, - определить равенство по значению через
__eq__, - заставить
len()и проверку истинности работать через__len__, - перегрузить операторы
+и*через__add__и__mul__, - оценить компромиссы, включая
NotImplementedи связь равенства с хешированием.
1. Что такое dunder-метод?
Каждый раз, когда вы пишете a + b, len(x) или print(obj), Python незаметно превращает этот синтаксис в вызов метода объекта. Имена таких методов окружены двойными подчёркиваниями — __add__, __len__, __str__ — поэтому программисты называют их "dunder" (double-under). Их также называют специальными методами.
Аналогия: представьте dunder-методы как электрические розетки в стене. Стена (Python) уже умеет подавать питание через стандартную розетку. Когда ваш класс предоставляет подходящую розетку — правильное имя и форму метода — встроенный механизм подключается напрямую. Вы не переделываете проводку в доме; вы просто вставляете стандартную вилку, чтобы len(), == и print() знали, что делать с вашим объектом.
Ключевая модель мышления: вы почти никогда не вызываете dunder-методы напрямую. Вы пишете естественный синтаксис, а Python сам направляет вызов к нужному dunder. Запись obj.__len__() работает, но весь смысл в том, что можно просто написать len(obj).