__hash__Метод __hash__ возвращает целочисленное значение хеша для объекта. Это значение используется внутри Python коллекциями на основе хеша, такими как dict и set, для эффективного хранения и поиска объектов.
Python требует соблюдения фундаментального контракта:
__eq__), они должны возвращать одно и то же значение хешаdict или set__hash__ и __eq__Когда ты переопределяешь __eq__, Python автоматически устанавливает __hash__ в None, делая экземпляры нехешируемыми по умолчанию. Это сделано намеренно — Python заставляет тебя принять осознанное решение о хешировании.
У тебя есть два варианта:
__hash__ на основе тех же полей, что используются в __eq____hash__ = None явно, если ты хочешь, чтобы экземпляры остались нехешируемымиclass Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __hash__(self):
return hash((self.x, self.y)) # согласуется с __eq__
__hash__ когда ты переопределяешь __eq____hash__ на тех же атрибутах, что используются в __eq__set или dict, могут вызвать трудноуловимые баги__hash__ = None явно, если равенство определено, но хешируемость нежелательнаКогда ты переопределяешь __eq__ в классе Python, метод __hash__ автоматически устанавливается в None, чтобы заставить тебя сознательно принять решение о поведении хеширования объектов.
Новый — ещё не проверен сообществом
Вы