Вам не нужно реализовывать __eq__
или __hash__
.
Пользовательские классы имеют методы __eq__()
и __hash__()
по умолчанию; с ними все объекты сравниваются неравно (кроме самих себя) и x.__hash__()
возвращает соответствующее значение, такое, что x == y
подразумевает и то, что x is y
и hash(x) == hash(y)
.
Источник: Модель данных
По умолчанию это что-то вроде:
class OnlyExists:
def __eq__(self, other):
return False
def __hash__(self):
return id(self)
Поскольку это неравно для всего, экземпляры могут быть найдены только по идентичности. Предоставление минимальной реализации ha sh (т.е. не просто возвращение одного и того же значения ha sh для каждого экземпляра) означает, что все экземпляры не в конечном итоге оказываются в одном и том же «ведре», что может привести к коллизии c. и означают, что все поисковые запросы по словарю / множеству упадут до O(n)
.
>>> class OnlyExists:
... pass
...
>>> a = OnlyExists()
>>> b = OnlyExists()
>>> s = {a, b}
>>> len(s)
2
>>> a in s
True
>>> b in s
True
>>> OnlyExists() in s
False