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

Respuestas a la pregunta(9)

Su respuesta a la pregunta