Можно ли применять объекты пользовательского класса в качестве ключей словаря?

Да, если равенство и хеш согласованы и не меняются во время использования ключа. Для сравнения по 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 в условии не определено; его нужно создать и заполнить до обращения по ключу.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее