Maneiras elegantes de oferecer suporte à equivalência ("igualdade") nas classes Python

Ao escrever classes personalizadas, geralmente é importante permitir equivalência por meio do método== e!= operadores. No Python, isso é possível com a implementação do__eq__ e__ne__ métodos especiais, respectivamente. A maneira mais fácil de encontrar isso é o seguinte 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)

Você conhece meios mais elegantes de fazer isso? Você conhece alguma desvantagem específica em usar o método acima para comparar__dict__s?

Nota: Um pouco de esclarecimento - quando__eq__ e__ne__ são indefinidos, você encontrará este comportamento:

>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
False

Isso é,a == b avalia comoFalse porque realmente funcionaa is b, um teste de identidade (ou seja, "Éa o mesmo objeto queb? ").

Quando__eq__ e__ne__ são definidos, você encontrará esse comportamento (que é o que procuramos):

>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
True

questionAnswers(9)

yourAnswerToTheQuestion