Выбор ответа Senior Декораторы обновлено

Класс как декоратор

Вопрос

Какой класс можно использовать как декоратор @Counted над функцией так, чтобы функция продолжила вызываться?

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

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

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

Коротко

Правильный ответ: Класс с init(self, func) и call, вызывающим func. @Counted превращается в f = Counted(f), то есть f становится экземпляром.

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

  1. Любой класс: Python сам добавит вызов исходной функции
  2. Только класс-наследник type, то есть метакласс
  3. Класс с __init__(self, func) и __call__, вызывающим funcправильный ответ
  4. Класс с __enter__ и __exit__, оборачивающий вызов

Разбор

@Counted превращается в f = Counted(f), то есть f становится экземпляром. Чтобы его можно было вызывать, нужен __call__, внутри которого вызывается сохранённая функция. Минус такого подхода: экземпляр не дескриптор, и на методах класса self не будет передан, пока не реализован __get__. Наследование от type нужно метаклассам, а __enter__/__exit__ относятся к контекстным менеджерам.

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

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