Python 2.x имеет два способа перегрузить операторы сравнения: __cmp__
или "богатые операторы сравнения", такие как __lt__
. Говорят, что предпочтительными являются богатые сравнительные перегрузки, но почему это так?
Богатые операторы сравнения проще реализовать каждый, но вы должны реализовать несколько из них с почти одинаковой логикой. Однако, если вы можете использовать встроенный порядок cmp
и кортеж, то __cmp__
становится довольно простым и выполняет все сравнения:
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
Эта простота, похоже, удовлетворяет мои потребности намного лучше, чем перегрузка всех 6 (!) богатых сравнений. (Тем не менее, вы можете получить его до "просто" 4, если вы полагаетесь на "измененный аргумент" /отраженное поведение, но это приводит к чистому увеличению сложности, по моему скромному мнению.)
Есть ли непредвиденные ошибки, о которых мне нужно знать, если я только перегружаю __cmp__
?
Я понимаю, что операторы <
, <=
, ==
и т.д. могут быть перегружены для других целей и могут возвращать любой объект, который им нравится. Я не спрашиваю о достоинствах этого подхода, но только о различиях при использовании этих операторов для сравнений в том же смысле, что они означают для чисел.
Обновление: Как указано Christopher , cmp
исчезает в 3.x. Существуют ли какие-либо альтернативы, которые делают сравнение реализации так же просто, как выше __cmp__
?