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