В 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__
?
Я понимаю <
, <=
, ==
и т.д. операторы могут быть перегружены для других целей, и может вернуть любой объект , им нравится. Я не спрашиваю о достоинствах этого подхода, а только о различиях при использовании этих операторов для сравнения в том же смысле, что и для чисел.
Обновление: как указал Кристофер , cmp
исчезает в 3.x. Существуют ли альтернативы, которые упрощают выполнение сравнений, как указано выше __cmp__
?