Вам следует реализовать метод __eq__
:
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
def __eq__(self, other):
if not isinstance(other, MyClass):
# don't attempt to compare against unrelated types
return NotImplemented
return self.foo == other.foo and self.bar == other.bar
Теперь выводит:
>>> x == y
True
Обратите внимание, что реализация __eq__
автоматически сделает экземпляры вашего класса недоступными для хранения, что означает, что они не могут быть сохранены в наборах и диктовках. Если вы не моделируете неизменный тип (т. Е. Если атрибуты foo
и bar
могут изменить значение в течение времени жизни вашего объекта), то рекомендуется просто оставить ваши экземпляры как не подлежащие изменению.
Если вы моделируете неизменный тип, вы также должны реализовать хук datamodel __hash__
:
class MyClass:
...
def __hash__(self):
# necessary for instances to behave sanely in dicts and sets.
return hash((self.foo, self.bar))
Общее решение, такое как идея циклического перебора по __dict__
и сравнения значений, не рекомендуется - оно никогда не может быть по-настоящему общим, поскольку __dict__
может иметь несопоставимые или неустранимые типы, содержащиеся в.
N.B .: помните, что перед Python 3 вам может понадобиться использовать __cmp__
вместо __eq__
. Пользователи Python 2 также могут захотеть внедрить __ne__
, поскольку разумное поведение по умолчанию для неравенства (то есть инвертирование результата равенства) не будет автоматически создано в Python 2.