from functools import total_ordering @total_ordering class MyObject: ... ...
Декоратор класса @total_ordering
модуля functools
оборачивает класс, который определяет один или несколько методов сравнения и добавляет остальные методы сравнения. Такое поведение декоратора упрощает усилия по определению всех возможных операций расширенного сравнения.
Класс должен определять один из методов __lt__()
, __le__()
, __gt__()
или __ge__()
. Кроме того, класс должен предоставлять метод __eq__()
.
Примечание.
Хотя этот декоратор позволяет создавать хорошо управляемые и полностью упорядоченные типы, это происходит за счет более медленного выполнения и более сложных трассировок стека для производных методов сравнения. Если анализ производительности показывает, что это является узким местом для данного приложения, реализация всех шести методов сравнения обеспечит повышение скорости.
from functools import total_ordering @total_ordering class Student: def _is_valid_operand(self, other): return (hasattr(other, "lastname") and hasattr(other, "firstname")) def __eq__(self, other): if not self._is_valid_operand(other): return NotImplemented return ((self.lastname.lower(), self.firstname.lower()) == (other.lastname.lower(), other.firstname.lower())) def __lt__(self, other): if not self._is_valid_operand(other): return NotImplemented return ((self.lastname.lower(), self.firstname.lower()) < (other.lastname.lower(), other.firstname.lower()))