Выбор ответа Senior Декораторы обновлено
Класс как декоратор
Вопрос
Какой класс можно использовать как декоратор @Counted над функцией так, чтобы функция продолжила вызываться?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Класс с init(self, func) и call, вызывающим func. @Counted превращается в f = Counted(f), то есть f становится экземпляром.
Варианты ответа
- Любой класс: Python сам добавит вызов исходной функции
- Только класс-наследник
type, то есть метакласс - Класс с
__init__(self, func)и__call__, вызывающимfuncправильный ответ - Класс с
__enter__и__exit__, оборачивающий вызов
Разбор
@Counted превращается в f = Counted(f), то есть f становится экземпляром. Чтобы его можно было вызывать, нужен __call__, внутри которого вызывается сохранённая функция. Минус такого подхода: экземпляр не дескриптор, и на методах класса self не будет передан, пока не реализован __get__. Наследование от type нужно метаклассам, а __enter__/__exit__ относятся к контекстным менеджерам.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.