Для полного набора функций сравнения я использовал следующий mixin, который вы могли бы добавить, например, в свой модуль, например, mixin.py.
class ComparableMixin(object):
def _compare(self, other, method):
try:
return method(self._cmpkey(), other._cmpkey())
except (AttributeError, TypeError):
# _cmpkey not implemented, or return different type,
# so I can't compare with "other".
return NotImplemented
def __lt__(self, other):
return self._compare(other, lambda s, o: s < o)
def __le__(self, other):
return self._compare(other, lambda s, o: s <= o)
def __eq__(self, other):
return self._compare(other, lambda s, o: s == o)
def __ge__(self, other):
return self._compare(other, lambda s, o: s >= o)
def __gt__(self, other):
return self._compare(other, lambda s, o: s > o)
def __ne__(self, other):
return self._compare(other, lambda s, o: s != o)
Чтобы использовать вышеописанный миксин, вам нужно реализовать метод _cmpkey (), который возвращает ключ объектов, которые можно сравнить, аналогично функции key (), используемой при сортировке. Реализация может выглядеть так:
>>> from .mixin import ComparableMixin
>>> class Orderable(ComparableMixin):
...
... def __init__(self, firstname, lastname):
... self.first = firstname
... self.last = lastname
...
... def _cmpkey(self):
... return (self.last, self.first)
...
... def __repr__(self):
... return "%s %s" % (self.first, self.last)
...
>>> sorted([Orderable('Donald', 'Duck'),
... Orderable('Paul', 'Anka')])
[Paul Anka, Donald Duck]
Причина, по которой я использую это вместо рецепта total_ordering: эта ошибка . Это исправлено в Python 3.4, но часто вам также необходимо поддерживать более старые версии Python.