Значение то же самое, но реализация отличается. Списки просто проверяют каждый объект, проверяя на равенство, чтобы он работал для вашего класса. Сначала устанавливает хэширование объектов, и если они не реализуют хеш должным образом, набор, кажется, не работает.
Ваш класс определяет __eq__
, но не определяет __hash__
, и поэтому не будет работать должным образом для наборов или в качестве ключей словарей. Правило для __eq__
и __hash__
состоит в том, что два объекта, которые __eq__
как Истина, также должны иметь равные хэши. По умолчанию объекты хэшируются в зависимости от их адреса памяти. Таким образом, ваши два объекта, которые равны по вашему определению, не предоставляют одинаковый хэш, поэтому они нарушают правило о __eq__
и __hash__
.
Если вы предоставите реализацию __hash__
, она будет работать нормально. Для вашего примера кода это может быть:
def __hash__(self):
return hash(self.someattribute)