2011-02-11 23 views

Respuesta

26

de Python “Data model” explica todo:

No existen relaciones implícitas entre los operadores de comparación. La verdad de x==y no implica que x!=y sea falso. En consecuencia, al definir __eq__(), también se debe definir __ne__() para que los operadores se comporten como se espera.

En C(1) != C(2), usa la implementación predeterminada, donde los objetos son iguales solo para ellos y no iguales para todo lo demás.

Definición __cmp__ puede ser más sencillo, ya que se utiliza como un mensaje para todas las operaciones de comparación, no sólo algunos de ellos:

... def __cmp__(self, o): 
...  return 0 
>>> C(1) != C(2) 
False 
+0

¿Hay alguna razón para no anular '' '__cmp__''' sobre' '' __eq__'''? –

+0

'__cmp__' es una función anterior de Python (' __eq__' tiene prioridad) y ahora se ha eliminado de Python 3, por lo que realmente no debería usarse en ningún código Python ahora: https://docs.python.org/3.0/whatsnew /3.0.html#ordering-comparisons – Cas

+0

"Eso fue cierto para Python 2, pero en Python 3 eso no es un buen consejo, porque una implementación predeterminada' __ne__' se hereda de la clase de objeto, y rara vez es necesario anularla. " - Fluent Python – 0TTT0

2

Tienes que definir tanto __ne__ como __eq__. ¡Y probablemente también deba considerar implementar __cmp__!

8

Hay una función separada para != que es __ne__ que se define implícitamente comparar los miembros de la instancia.

Lo que se quiere hacer es:

def __ne__(self, other): 
    return not self.__eq__(other) 

o alguna variante de este.

+0

whoops, mi mal. fijo – milkypostman

Cuestiones relacionadas