Python中基于类的装饰器 - PEP定义语法和语义?

时间:2014-06-02 21:43:24

标签: python decorator python-decorators 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 个答案:

答案 0 :(得分:2)

从一开始就包括基于类的装饰器;引用PEP 318的Design Goals section

  

新语法

     
      
  • 适用于任意包装器,包括用户定义的callables
  •   

强调我的。

类是用户定义的callables。调用类会产生一个实例;和类似的函数一样,类实例只是另一个对象

你可以通过在类上定义__call__ method来使实例可调用,让你用实例替换函数,这一事实一直是语言的一部分,而且永远不需要在PEP中调用。