Что такое dunder методы (магические методы) в Python
Pythonконцепциимагические методыосновы
Что проверяют
Понимаете ли вы, что синтаксис языка опирается на протоколы, и знаете ли основные из них.
Как отвечать
Dunder-методы (от double underscore) это методы вида __len__, __eq__, __iter__. Их вызывает не программист, а сам язык: интерпретатор переводит синтаксис в вызовы этих методов.
len(obj) → obj.__len__()
a + b → a.__add__(b)
obj[key] → obj.__getitem__(key)
for x in obj → obj.__iter__()
with obj → obj.__enter__() / obj.__exit__()Основные группы:
- создание и жизнь:
__new__,__init__,__del__; - представление:
__repr__(для отладки, однозначное) и__str__(для человека); - сравнение и хеш:
__eq__,__lt__,__hash__. Переопределили__eq__, значит нужен и__hash__, иначе объект перестаёт быть хешируемым; - контейнер:
__len__,__getitem__,__setitem__,__contains__,__iter__,__next__; - контекстный менеджер:
__enter__,__exit__; - вызов:
__call__делает объект вызываемым; - атрибуты:
__getattr__(только если обычный поиск не удался),__getattribute__(всегда),__setattr__; - дескрипторы:
__get__,__set__,__set_name__. На них построеныpropertyи поля ORM.
Смысл в утиной типизации: чтобы объект работал в цикле for, ему не нужно наследоваться от чего-либо, достаточно реализовать протокол.
Где спотыкаются
Вызывают такие методы напрямую вместо встроенных функций.
Переопределяют __eq__ и забывают __hash__.
Путают __repr__ и __str__.
Реализуют __getattr__ с обращением к собственным атрибутам и получают бесконечную рекурсию.