Декораторы на основе классов в Python - какой PEP определяет синтаксис и семантику?

Я открываю полный список PEP: http://legacy.python.org/dev/peps/ и выполняю поиск по decorator ключевое слово.

Есть два PEP с этим ключевым словом в заголовке:

но они ничего не говорят о декораторах на основе классов...

Интересно, когда и как основанные на классах декораторы введены в Python.

ОБНОВЛЕНИЕ Я говорю о:

class NoArgsClassDecorator:

    def __init__(self, f):
        self.f = f

    def __call__(self):
        print('Inside %s.__call__(). You call %s()' % (self.__class__, self.f.__name__))
        self.f()
        print('Inside %s.__call__(). We finish %s()' % (self.__class__, self.f.__name__))

@NoArgsClassDecorator
def hello():
    print('hello')

1 ответ

Решение

Классовые декораторы были включены с самого начала; процитировав раздел "Цели проектирования " в PEP 318:

Новый синтаксис должен

  • работать с произвольными обертками, включая определяемые пользователем вызовы

Акцент мой.

Классы определяются пользователем. Вызов класса создает экземпляр; и как функции, экземпляры классов - это просто еще один объект.

Тот факт, что вы можете сделать экземпляры вызываемыми тоже путем определения __call__ Метод класса, позволяющий заменять функции экземплярами, долгое время был частью языка и никогда не нуждался в вызове в PEP.

Другие вопросы по тегам