1

我打开 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')
4

1 回答 1

2

从一开始就包含基于类的装饰器;引用PEP 318的设计目标部分:

新语法应该

  • 适用于任意包装器,包括用户定义的可调用对象

强调我的。

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

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

于 2014-06-02T23:00:57.130 回答