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