Python 2.x ha due modi per sovraccaricare gli operatori di confronto, __cmp__
o gli "operatori di confronto avanzati" come __lt__
. Si dice che i ricchi sovraccarichi di confronto siano preferiti, ma perché è così?
Gli operatori di confronto avanzato sono più semplici da implementare ciascuno, ma è necessario implementarne diversi con una logica quasi identica. Tuttavia, se puoi usare l' cmp
ordinamento integrato e delle tuple, __cmp__
diventa abbastanza semplice e soddisfa tutti i confronti:
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))
Questa semplicità sembra soddisfare le mie esigenze molto meglio che sovraccaricare tutti e 6 (!) I ricchi confronti. (Tuttavia, puoi ridurlo a "solo" 4 se ti affidi all '"argomento scambiato" / comportamento riflesso, ma a mio modesto parere ciò si traduce in un netto aumento della complicazione.)
Ci sono insidie impreviste di cui devo essere consapevole se solo sovraccarico __cmp__
?
Capisco il <
, <=
, ==
, ecc operatori possono essere sovraccaricati per altri scopi, e può restituire qualsiasi oggetto a loro piace. Non sto chiedendo i meriti di tale approccio, ma solo le differenze quando si usano questi operatori per i confronti nello stesso senso in cui intendono per i numeri.
Aggiornamento: come ha sottolineato Christopher , cmp
sta scomparendo in 3.x. Esistono alternative che rendono l'implementazione dei confronti facile come sopra __cmp__
?