Марк Рэнсом ответил на ТАК вопрос о хешах здесь, в СО:
[...] An
Объект является хешируемым, если он имеет хеш-значение , которое никогда не изменяется во время
его время жизни . Так что по официальному определению ничего мутабельного не может
быть хэшируемым, даже если он имеет функцию __hash__()
. Мое заявление
о том, что оба требования необходимы, не соответствует действительности, потому что
hashable уже подразумевает требование быть неизменным.
Я хочу убедиться, что я понял это правильно - даже не как носитель языка - поэтому я надеюсь, что кто-то исправит меня, если я ошибаюсь.
Предполагая, что этот класс
class Author(object):
def __init__(self, id, name, age):
self.id = id
self.name = name
self.age = age
def __eq__(self, other):
return self.id==other.id\
and self.name==other.name
def __hash__(self):
return hash(('id', self.id,
'name', self.name))
Я понимаю, что __eq__
позволяет мне сравнивать объекты этого класса с оператором ==
. Из ответа Маркса я понимаю, что даже если мой объект peter = Author(1, "Peter", 33)
имеет __hash__
, он не может быть хэшируемым, потому что я потенциально мог бы сделать что-то вроде peter.age = 43
, что означает, что он не является неизменным. То есть мои объекты класса Author
не являются хэшируемыми и поэтому не могут использоваться как ключи в словарях, например? Я понял правильно или мне кажется, что мне нужно больше объяснений? : -)