python装饰器只是装饰下面的函数或下面的所有函数吗?

时间:2016-06-01 09:03:07

标签: python python-3.x

我的课程定义如下:

class myClass(object):
    @lru_cache(maxsize=None)
    def f1(self):
        return 1

    def f2(self):
        return 2

我想知道的是,@lru_cache装饰器是否适用于下面的所有函数,直到它碰到另一个装饰器,或者仅仅是以下函数?

如果我想装饰f2,我是否还需要在其上方重复@lru_cache

3 个答案:

答案 0 :(得分:5)

你可以通过定义一个能告诉你是否装饰东西的装饰器来轻松地自己测试。例如这一个:

def myDecorator (f):
    print('Decorated {0}'.format(f.__name__))
    return f

然后,与您的班级一起使用时:

class MyClass:
    @myDecorator
    def f1 (self):
        return 1

    def f2 (self):
        return 2

...你得到以下输出:

Decorated f1

所以装饰器只适用于它直接装饰的功能。如果你考虑一下,这很有意义,因为 undecorate 函数没有语法。由于您可以将多个装饰器应用于单个函数,因此也没有覆盖装饰器的概念。

最后,根据the zen of Python“显式优于隐式”。因此,我们宁愿明确列出应该应用的每个函数的装饰器,而不是隐式地使用以某种魔术方式应用它的规则,因为它在语法上出现过。

答案 1 :(得分:1)

装饰器只适用于它后面的函数,如果是另一种方式,如果我不想装饰这个函数会发生什么?所以他们只适用于以下功能。

因此,如果要缓存它,必须在@lru_cahce函数上使用f2

答案 2 :(得分:0)

除了poke的回答:如何看待函数定义的正式语法?

请参阅https://docs.python.org/3/reference/compound_stmts.html#function-definitions

funcdef ::=  [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite

因此,任何修改函数的装饰器都必须直接列在以 def 开头的行之前。没有其他代码可以介入。