Python 2.x ma dwa sposoby na przeciążenie operatorów porównania __cmp__
lub „bogatych operatorów porównania”, takich jak __lt__
. Mówi się, że preferowane są bogate przeciążenia porównawcze, ale dlaczego tak jest?
Bogate operatory porównania są prostsze w implementacji każdego z nich, ale musisz zaimplementować kilka z nich z prawie identyczną logiką. Jeśli jednak możesz użyć cmp
porządkowania wbudowanego i krotki, to __cmp__
robi się całkiem proste i spełnia wszystkie porównania:
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))
Ta prostota wydaje się znacznie lepiej spełniać moje potrzeby niż przeładowanie wszystkich 6 (!) Bogatych porównań. (Jednak możesz sprowadzić to do „tylko” 4, jeśli polegasz na „zamienionym argumencie” / odzwierciedlonym zachowaniu, ale moim skromnym zdaniem powoduje to wzrost netto komplikacji).
Czy są jakieś nieprzewidziane pułapki, o których muszę wiedzieć, jeśli tylko przeciążę __cmp__
?
Rozumiem <
, <=
, ==
itp operatorzy mogą być przeciążone dla innych celów, a każdy obiekt może powrócić im się podoba. Nie pytam o zalety tego podejścia, a tylko o różnice, gdy używam tych operatorów do porównań w tym samym sensie, co dla liczb.
Aktualizacja: Jak zauważył Christopher , cmp
znika w 3.x. Czy są jakieś alternatywy, które sprawiają, że wykonywanie porównań jest tak proste, jak powyższe __cmp__
?