2015-06-04 10 views
6

Załóżmy, że mam następujący program:Czy __ne__ korzysta z nadpisanego __eq__?

class A(object):                                                                
    def __eq__(self, other): 
     return True 

a0 = A() 
a1 = A() 
print a0 != a1 

Jeśli uruchomić go z Python wyjście jest True. Moje pytanie brzmi:

  1. Metoda __ne__ nie jest zaimplementowana, czy Python ma domyślną wartość?
  2. jeśli Python upada na domyślną metodę ustalenia, czy dwa obiekty są równe, czy nie, czy nie powinien wywołać __eq__, a następnie zanegować wynik?

Odpowiedz

12

Od the docs:

Brak implikowane relacje między operatorami porównawczych. Prawda: x==y nie oznacza, że ​​x!=y jest fałszywa. W związku z tym, definiując __eq__(), należy również zdefiniować __ne__(), aby operatorzy zachowywali się zgodnie z oczekiwaniami.

+0

Więc jeśli '' __ne__'' nie jest zaimplementowane, czy Python nie powinien generować wyjątku, jeśli użyję ''! = '' Do porównania dwóch obiektów? – dorafmon

+3

@dorafmon: nie, ponieważ domyślna implementacja nie konsultuje '__eq__', po prostu zwraca' self is not other'. –

Powiązane problemy