__hash__()
используется встроенным hash()
и при добавлении объектов в хешированные коллекции, такие как словарии устанавливает.Наличие __hash__()
подразумевает, что экземпляры класса являются неизменяемыми.Изменчивость - это сложное свойство, которое зависит от намерения программиста, существования и поведения __eq__()
, а также от значений флагов eq и frozen в декораторе dataclass()
.
По умолчанию dataclass()
будетнеявно добавлять метод __hash__()
, если это не безопасно.Он также не добавит и не изменит существующий явно определенный метод __hash__()
.Установка атрибута класса __hash__ = None
имеет особое значение для Python, как описано в документации __hash__()
.
Если __hash__()
не определено явным образом или если для него задано значение Нет, то dataclass()
может добавить неявный метод __hash__()
.Хотя это и не рекомендуется, вы можете заставить dataclass()
создать метод __hash__()
с помощью unsafe_hash=True
.Это может быть в том случае, если ваш класс логически неизменен, но, тем не менее, может быть видоизменен.Это специализированный вариант использования, и его следует тщательно рассмотреть.
Вот правила, управляющие неявным созданием метода __hash__()
.Обратите внимание, что вы не можете одновременно иметь явный метод __hash__()
в своем классе данных и установить unsafe_hash=True
;это приведет к TypeError
.
Если eq и frozen оба имеют значение true, по умолчанию dataclass()
сгенерирует метод __hash__()
для вас.Если eq равно true, а замораживается как false, для __hash__()
будет установлено значение None, помечая его как не подлежащее обработке (что является изменяемым).Если eq равно false, __hash__()
останется без изменений, что означает, что будет использован метод __hash__()
суперкласса (если суперкласс является объектом, это означает, что он вернется к хешированию на основе идентификаторов).