Элегантные способы поддержки эквивалентности («равенства») в классах Python
При написании пользовательских классов часто важно разрешить эквивалентность посредством==
а также!=
операторы. В Python это стало возможным благодаря реализации__eq__
а также__ne__
специальные методы соответственно. Я нашел самый простой способ сделать это следующим способом:
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)
Знаете ли вы о более элегантных способах сделать это? Знаете ли вы какие-либо конкретные недостатки использования вышеуказанного метода сравнения__dict__
s?
Заметка: Немного пояснений - когда__eq__
а также__ne__
не определены, вы найдете это поведение:
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
False
То есть,a == b
оцениваетFalse
потому что это действительно работаетa is b
тест личности (то естьa
тот же объект, что иb
? ").
когда__eq__
а также__ne__
определены, вы найдете это поведение (которое мы ищем):
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
True