Выбор ответа Middle ООП и dataclasses обновлено
__eq__ без __hash__
Вопрос
Класс определяет __eq__, но не __hash__. Что будет при {Point(1, 2)}?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: TypeError: unhashable type: 'Point'. Если в классе определён eq, а hash нет, Python ставит hash = None, ведь хеш по id нарушил бы правило «равные объекты имеют равные хеши».
Варианты ответа
- Множество создастся, хеш возьмётся по
id TypeError: unhashable type: 'Point'правильный ответ- Множество создастся, хеш вычислится по полям автоматически
AttributeError: __hash__
Разбор
Если в классе определён __eq__, а __hash__ нет, Python ставит __hash__ = None, ведь хеш по id нарушил бы правило «равные объекты имеют равные хеши». Поэтому экземпляры перестают быть хешируемыми. Решения: определить __hash__ по тем же полям, что и __eq__, или @dataclass(frozen=True). Автоматически по полям хеш не строится.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Приоритет дескрипторов и словаря экземпляра
Следующий вопрос
Неизменяемый dataclass со списком