Python 2.x bietet zwei Möglichkeiten, um Vergleichsoperatoren __cmp__
oder die "Rich-Vergleichsoperatoren" wie z __lt__
. Die reichhaltigen Vergleichsüberladungen sollen bevorzugt werden, aber warum ist das so?
Umfangreiche Vergleichsoperatoren sind einfacher zu implementieren, Sie müssen jedoch mehrere davon mit nahezu identischer Logik implementieren. Wenn Sie jedoch die integrierte Reihenfolge cmp
und die Tupelreihenfolge verwenden können , __cmp__
wird dies recht einfach und erfüllt alle Vergleiche:
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))
Diese Einfachheit scheint meine Bedürfnisse viel besser zu erfüllen, als alle 6 (!) Der reichhaltigen Vergleiche zu überladen. (Sie können es jedoch auf "nur" 4 reduzieren, wenn Sie sich auf das "getauschte Argument" / reflektiertes Verhalten verlassen, aber dies führt meiner bescheidenen Meinung nach zu einer Nettoerhöhung der Komplikationen.)
Gibt es unvorhergesehene Fallstricke, auf die ich aufmerksam gemacht werden muss, wenn ich nur überlastete __cmp__
?
Ich verstehe das <
, <=
, ==
, etc. können Betreiber für andere Zwecke überlastet werden und kann zurückkehren , jedes Objekt die sie mögen. Ich frage nicht nach den Vorzügen dieses Ansatzes, sondern nur nach Unterschieden, wenn diese Operatoren für Vergleiche in demselben Sinne verwendet werden, wie sie für Zahlen bedeuten.
Update: Wie Christopher betonte , cmp
verschwindet es in 3.x. Gibt es Alternativen, die die Implementierung von Vergleichen so einfach wie oben machen __cmp__
?