⚡ Краткий справочник
__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) | != | bool | Python может использовать 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] = value | None | Установить элемент |
__delitem__(self, key) | del obj[key] | None | Удалить элемент |
__contains__(self, item) | item in obj | bool | Проверить вхождение |
__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 |