Python 2.x ha due modi per sovraccaricare gli operatori di confronto, __cmp__
o gli "operatori di confronto avanzato" come __lt__
. Si dice che i rich overload di confronto siano preferiti, ma perché è così?
Gli operatori di confronto avanzato sono più semplici da implementare ciascuno, ma è necessario implementarne molti con una logica quasi identica . Tuttavia, se puoi usare il cmp
integrato e l'ordinamento delle tuple, allora __cmp__
diventa abbastanza semplice e soddisfa tutti i confronti:
classe A (oggetto): def __init__(self, name, age, other): self.name = name self.age = age self.other = other def __cmp__(self, other): assert isinstance(other, A) # presupposto per questo esempio 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 (!) dei ricchi confronti. (Tuttavia, puoi ridurlo a "solo" 4 se fai affidamento sull'"argomento scambiato"/comportamento riflesso, ma ciò si traduce in un netto aumento delle complicazioni, a mio modesto parere.)
< strong>Ci sono delle insidie impreviste di cui devo essere informato se solo sovraccarico __cmp__
?
Comprendo il <
, <=
, ==
, ecc. gli operatori possono essere sovraccaricati per altri scopi e possono restituire qualsiasi oggetto che gli piace. Non sto chiedendo i meriti di tale approccio, ma solo le differenze quando si utilizzano questi operatori per i confronti nello stesso senso che significano per i numeri.
Aggiornamento: As Christopher ha sottolineato, cmp
sta scomparendo in 3.x. Ci sono alternative che rendano l'implementazione dei confronti facile come il __cmp__
sopra?