2015-12-31 19 views
19
class L(object): 
    def __eq__(self, other): 
     print 'invoked L.__eq__' 
     return False 

class R(object): 
    def __eq__(self, other): 
     print 'invoked R.__eq__' 
     return False 

left = L() 
right = R() 

Con questo codice, lato sinistro ottiene il primo colpo a confronto, come documented nel modello di dati:pitone uguaglianza precedenza

>>> left == right 
invoked L.__eq__ 
False 

Ma se facciamo una piccola modifica sulla linea 6 (tutto il resto del stessa):

class R(L): 

Ora il lato destro viene ad avere il primo colpo a confronto.

>>> left == right 
invoked R.__eq__ 
False 

Perché è quello? Dove è documentato e qual è la ragione della decisione di progettazione?

risposta

18

Questo è documentato sotto il numeric operations, più in basso nella pagina, con una spiegazione del perché funziona in questo modo:

Nota: se il tipo di operando a destra è una sottoclasse di tipo del operando a sinistra e che sottoclasse fornisce il metodo riflesso per l'operazione, questo metodo verrà chiamato prima del metodo non riflesso dell'operando di sinistra. Questo comportamento consente alle sottoclassi di sovrascrivere le operazioni dei loro antenati.

Il Python 3 documentation menzioni inoltre nella sezione che stavi guardando:

Se gli operandi sono di diversi tipi, e il tipo di operando a destra è una sottoclasse diretta o indiretta di tipo del operando sinistro, il il metodo riflesso dell'operando di destra ha la priorità, altrimenti il ​​metodo dell'operando di sinistra ha la priorità. La sottoclasse virtuale non è considerata.