Что нужно реализовать в классе, чтобы он стал хешируемым?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Чтобы класс в Python стал хешируемым, необходимо реализовать два метода: __eq__ и __hash__.
__eq__(self, other): Этот метод определяет операцию сравнения на равенство (==). Он должен принимать другой объектotherи возвращатьTrue, если объекты равны, иFalseв противном случае.__hash__(self): Этот метод должен возвращать целочисленное хеш-значение объекта. Еслиa == bвсегда истинно, тоhash(a)также должно быть равноhash(b). Хеш должен оставаться неизменным в течение всего срока жизни объекта.
Если вы реализуете только __eq__, но не __hash__, Python автоматически присвоит __hash__ значение None, делая объект нехешируемым. Если вы реализуете только __hash__, но не __eq__, Python будет использовать реализацию сравнения по умолчанию (сравнение по идентификатору), что может привести к некорректному поведению при использовании объектов в хешируемых коллекциях.
Классы, содержащие изменяемые атрибуты, как правило, не должны быть хешируемыми, так как изменение атрибута после вычисления хеша нарушает инвариант, требующий неизменности хеша объекта в течение его жизни.
Пример:
class MyImmutableClass:
def __init__(self, value):
self.value = value // Атрибут, который не меняется после инициализации
def __eq__(self, other):
if not isinstance(other, MyImmutableClass):
return NotImplemented
return self.value == other.value
def __hash__(self):
return hash(self.value)