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

Декоратор-класс на методе

Вопрос

Декоратор реализован классом с __init__(self, func) и __call__(self, *args). Почему при декорировании метода obj.method() падает с ошибкой про недостающий аргумент?

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

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

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

Коротко

Правильный ответ: Без get экземпляр не связывается с объектом, self теряется. Обычные функции реализуют get, поэтому obj.method превращается в связанный метод с self.

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

  1. Методы нельзя декорировать классами, только функциями
  2. Нужно поверх добавить @staticmethod, иначе вызов не сработает
  3. Классы-декораторы работают только в Python 2, в 3 их убрали
  4. Без __get__ экземпляр не связывается с объектом, self теряетсяправильный ответ

Разбор

Обычные функции реализуют __get__, поэтому obj.method превращается в связанный метод с self. Экземпляр произвольного класса этого не умеет, и при вызове obj.method() в __call__ не попадает obj. Решение: реализовать __get__, возвращая functools.partial(self.__call__, instance) или types.MethodType(self, instance), либо писать декоратор функцией.

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

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