Как можно сделать Python объекты хешируемыми, когда нечего различать guish их? - PullRequest
0 голосов
/ 21 марта 2020

Допустим, я хочу использовать set () для хранения группы объектов, единственное отличие которых состоит в том, что они существуют и не являются другими экземплярами того же класса. В противном случае они не различимы, например, нет def __eq__(self, other): return self.qux == other.qux, потому что qux является одинаковым (или случайным) для всех из них. Как вы определяете функции __eq__ и __hash__ для этого класса?

1 Ответ

2 голосов
/ 21 марта 2020

Вам не нужно реализовывать __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
...