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

Приоритет дескрипторов и словаря экземпляра

Вопрос

В классе есть property с именем x, и кто-то записал obj.__dict__["x"] = 5. Что вернёт obj.x?

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

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

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

Коротко

Правильный ответ: Значение геттера: дескриптор данных важнее dict. Порядок поиска в object.getattribute: сначала дескрипторы данных в классе (у них есть set или delete, как у property), затем словарь экземпляра, затем дескрипторы без set (например, обычные функции) и атрибуты класса.

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

  1. 5: словарь экземпляра всегда приоритетнее класса
  2. AttributeError из-за конфликта имён x
  3. Кортеж из обоих значений: (5, геттер)
  4. Значение геттера: дескриптор данных важнее __dict__правильный ответ

Разбор

Порядок поиска в object.__getattribute__: сначала дескрипторы данных в классе (у них есть __set__ или __delete__, как у property), затем словарь экземпляра, затем дескрипторы без __set__ (например, обычные функции) и атрибуты класса. Поэтому property нельзя перекрыть записью в __dict__, а метод можно перекрыть атрибутом экземпляра.

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

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

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