Вопрос проверяет знание протокола сравнения и хэширования пользовательских объектов.
Чтобы экземпляры класса можно было использовать как ключи словаря, необходимо корректно реализовать методы __hash__() и __eq__(). Метод __hash__() возвращает числовой хэш, а __eq__() определяет равенство объектов. Если объекты равны, их хэш должен совпадать. Также объект не должен изменять данные, участвующие в вычислении хэша.
Для использования объектов в качестве ключей словаря Python требует соблюдения контракта хэширования.
Минимально необходимо реализовать:
__eq__(self, other) — определяет равенство объектов.
__hash__(self) — возвращает целое значение хэша.
Пример:
class User:
def __init__(self, user_id):
self.user_id = user_id
def __eq__(self, other):
return isinstance(other, User) and self.user_id == other.user_id
def __hash__(self):
return hash(self.user_id)
Теперь объект можно использовать как ключ:
d = {User(1): "Alice"}
Должно выполняться правило:
if a == b:
hash(a) == hash(b)
Если это правило нарушается, словари и множества начинают работать некорректно.
Если определить __eq__() и не определить __hash__(), Python автоматически сделает объект нехэшируемым, чтобы избежать ошибок.
Для использования объектов как ключей словаря необходимо реализовать согласованные методы __eq__() и __hash__() и обеспечить неизменяемость данных, участвующих в вычислении хэша.