🔖 Справочник магических методов

⚡ Краткий справочник

  • __eq__(self, other)==; проверяйте isinstance.
  • __lt__(self, other)<; возвращайте NotImplemented для чужих типов.
  • @total_ordering — из functools, генерирует остальные сравнения.
  • __getitem__, __setitem__, __contains__, __len__ — для контейнеров.
  • __add__ — новый объект; __iadd__ — изменяет self и возвращает его.
  • __bool__ — должен вернуть bool.
  • __call__ — вызывается при obj().

Методы сравнения

МетодОператорВозвращаетПримечание
__eq__(self, other)==boolЕсли не задан, сравнение по идентификатору
__ne__(self, other)!=boolPython может использовать not __eq__
__lt__(self, other)<boolДостаточно для sorted()
__le__(self, other)<=boolМожет быть сгенерирован @total_ordering
__gt__(self, other)>boolМожет быть сгенерирован @total_ordering
__ge__(self, other)>=boolМожет быть сгенерирован @total_ordering

Синтаксис @total_ordering

from functools import total_ordering

@total_ordering
class MyClass:
    def __eq__(self, other: object) -> bool:
        ...

    def __lt__(self, other: MyClass) -> bool:
        ...

Требования: класс должен реализовать __eq__ и ровно один из __lt__, __le__, __gt__, __ge__.

Методы индексации

МетодОператор/функцияВозвращаетНазначение
__getitem__(self, key)obj[key]значениеПолучить элемент
__setitem__(self, key, value)obj[key] = valueNoneУстановить элемент
__delitem__(self, key)del obj[key]NoneУдалить элемент
__contains__(self, item)item in objboolПроверить вхождение
__len__(self)len(obj)intКоличество элементов

Арифметические методы

МетодОператорМетодОператор
__add__+__iadd__+=
__sub__-__isub__-=
__mul__*__imul__*=
__truediv__/__itruediv__/=
__floordiv__//__ifloordiv__//=
__mod__%__imod__%=
__pow__**__ipow__**=

Правило: обычные методы возвращают новый объект, инкрементные — изменяют self и возвращают self.

__bool__ и __call__

МетодИспользованиеВозвращаетПримечание
__bool__(self)bool(obj), if obj:boolЕсли не задан, используется __len__
__call__(self, ...)obj(...)любоеОбъект ведёт себя как функция

Что возвращать

СитуацияЧто делать
Операнд неподходящего типаВернуть NotImplemented, чтобы Python попробовал зеркальный метод
Сравнение несовместимых объектовМожно вернуть NotImplemented или бросить TypeError
__len__Только int >= 0
__bool__Только bool
__add__Новый объект того же типа
__iadd__Изменить self и вернуть self