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' cmpordinamento 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 , cmpsta scomparendo in 3.x. Esistono alternative che rendono l'implementazione dei confronti facile come sopra __cmp__?