Formas elegantes de apoyar la equivalencia ("igualdad") en las clases de Python
Al escribir clases personalizadas, a menudo es importante permitir la equivalencia mediante==
y!=
operadores En Python, esto es posible mediante la implementación de__eq__
y__ne__
métodos especiales, respectivamente. La forma más fácil que he encontrado para hacer esto es el siguiente método:
class Foo:
def __init__(self, item):
self.item = item
def __eq__(self, other):
if isinstance(other, self.__class__):
return self.__dict__ == other.__dict__
else:
return False
def __ne__(self, other):
return not self.__eq__(other)
¿Conoces formas más elegantes de hacer esto? ¿Conoce alguna desventaja particular al usar el método anterior de comparación__dict__
s?
Nota: Un poco de aclaración - cuando__eq__
y__ne__
no están definidos, encontrará este comportamiento:
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
False
Es decir,a == b
evalúa aFalse
porque realmente correa is b
, una prueba de identidad (es decir, "Esa
el mismo objeto queb
? ").
Cuando__eq__
y__ne__
están definidos, encontrarás este comportamiento (que es el que buscamos):
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
True