У 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__
?