Выбор ответа Middle ООП и dataclasses обновлено

__eq__ без __hash__

Вопрос

Класс определяет __eq__, но не __hash__. Что будет при {Point(1, 2)}?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: TypeError: unhashable type: 'Point'. Если в классе определён eq, а hash нет, Python ставит hash = None, ведь хеш по id нарушил бы правило «равные объекты имеют равные хеши».

Варианты ответа

  1. Множество создастся, хеш возьмётся по id
  2. TypeError: unhashable type: 'Point'правильный ответ
  3. Множество создастся, хеш вычислится по полям автоматически
  4. AttributeError: __hash__

Разбор

Если в классе определён __eq__, а __hash__ нет, Python ставит __hash__ = None, ведь хеш по id нарушил бы правило «равные объекты имеют равные хеши». Поэтому экземпляры перестают быть хешируемыми. Решения: определить __hash__ по тем же полям, что и __eq__, или @dataclass(frozen=True). Автоматически по полям хеш не строится.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме