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

__getattr__ против __getattribute__

Вопрос

Когда вызывается __getattr__?

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

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

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

Коротко

Правильный ответ: Только когда обычный поиск атрибута не нашёл его. Обычный поиск (getattribute) смотрит дескрипторы данных, словарь экземпляра, класс и родителей.

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

  1. Только когда обычный поиск атрибута не нашёл егоправильный ответ
  2. При каждом обращении к любому атрибуту объекта
  3. Только при обращении к атрибутам класса, не экземпляра
  4. При присваивании атрибута, до записи в __dict__

Разбор

Обычный поиск (__getattribute__) смотрит дескрипторы данных, словарь экземпляра, класс и родителей. Если ничего не нашлось и бросился AttributeError, Python вызывает __getattr__. Поэтому его используют для прокси и ленивых атрибутов. При каждом обращении вызывается __getattribute__, переопределять его опасно: легко уйти в рекурсию. Присваивание обслуживает __setattr__.

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

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

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