Выбор ответа Senior Декораторы обновлено
Декоратор-класс на методе
Вопрос
Декоратор реализован классом с __init__(self, func) и __call__(self, *args). Почему при декорировании метода obj.method() падает с ошибкой про недостающий аргумент?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Без get экземпляр не связывается с объектом, self теряется. Обычные функции реализуют get, поэтому obj.method превращается в связанный метод с self.
Варианты ответа
- Методы нельзя декорировать классами, только функциями
- Нужно поверх добавить
@staticmethod, иначе вызов не сработает - Классы-декораторы работают только в Python 2, в 3 их убрали
- Без
__get__экземпляр не связывается с объектом,selfтеряетсяправильный ответ
Разбор
Обычные функции реализуют __get__, поэтому obj.method превращается в связанный метод с self. Экземпляр произвольного класса этого не умеет, и при вызове obj.method() в __call__ не попадает obj. Решение: реализовать __get__, возвращая functools.partial(self.__call__, instance) или types.MethodType(self, instance), либо писать декоратор функцией.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.