Да, если равенство и хеш согласованы и не меняются во время использования ключа. Для сравнения по n удобен неизменяемый dataclass.
Можно ли применять объекты пользовательского класса в качестве ключей словаря?
Да, если равенство и хеш согласованы и не меняются во время использования ключа. Для сравнения по n удобен неизменяемый dataclass.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно выяснить, допускает ли Python использование экземпляров собственного класса в качестве ключей словаря и какие методы следует определить, чтобы сравнение объектов и их хеширование работали правильно.
class C:
def __init__(self, n) -> None:
self._n = n
assert C(5) == C(5)
assert d[C(5)] == d[C(5)]
Ответ
Да, если равенство и хеш согласованы и не меняются во время использования ключа. Для сравнения по n удобен неизменяемый dataclass.
from dataclasses import dataclass
@dataclass(frozen=True)
class C:
_n: int
assert C(5) == C(5)
d = {C(5): 'value'}
assert d[C(5)] == d[C(5)]
В исходном классе без __eq__ разные экземпляры сравниваются по идентичности, поэтому первый assert не проходит. Если определить равенство по _n, хеш тоже должен зависеть от _n. Изменять это поле после добавления ключа нельзя: словарь может перестать находить запись. Само d в условии не определено; его нужно создать и заполнить до обращения по ключу.