Да, текущие экземпляры уже допустимы как ключи: хеш стабилен, а равенство унаследовано по идентичности. Постоянный hash=0 лишь создаёт множество коллизий.
Можно ли использовать экземпляр класса KeyHolder в качестве ключа словаря?
Да, текущие экземпляры уже допустимы как ключи: хеш стабилен, а равенство унаследовано по идентичности. Постоянный hash=0 лишь создаёт множество коллизий.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В задаче рассматривается класс KeyHolder. Нужно определить, допускает ли его объект роль ключа в стандартном словаре Python. Если текущая реализация не подходит, опишите, какие изменения следует внести в класс, чтобы его экземпляры корректно функционировали как ключи. Пример исходного кода:
class KeyHolder:
def __init__(self, key):
self.key = key
def __hash__(self):
return 0
Обратите внимание, что для использования в качестве ключа важны методы __hash__ и __eq__. Предложите необходимые доработки.
Ответ
Да, текущие экземпляры уже допустимы как ключи: хеш стабилен, а равенство унаследовано по идентичности. Постоянный hash=0 лишь создаёт множество коллизий.
Разные KeyHolder остаются разными ключами даже при одинаковом key, потому что __eq__ не переопределён. Изменение self.key не меняет текущий постоянный хеш, поэтому само по себе не нарушает этот идентичностный контракт.
Если требуется поиск по значению key, используйте согласованное равенство и неизменяемые поля:
from dataclasses import dataclass
@dataclass(frozen=True)
class KeyHolder:
key: str
Теперь KeyHolder('a') равен другому экземпляру с 'a', и хеш соответствует равенству. Для идентичностной семантики проще вообще удалить собственный __hash__ и оставить реализацию object.