嵌套的python装饰器?

Kie*_*ran 3 python decorator

我不知道"嵌套python装饰器?" 是说出这个问题的正确方法,所以如果不是,请告诉我.

无论如何,我正在学习udacity,刚刚遇到一些涉及python装饰的代码,看起来像巫术魔法,所以现在我想问一个普遍的问题,看看我是否可以找出代码.

假设我有以下代码:

def A(f):
    print 'blah'
    return f

@A
def B(f):
    return f

@B
def C():
    pass
Run Code Online (Sandbox Code Playgroud)

现在,我明白从上面的代码中,装饰器导致B变成:

B = A(B)
Run Code Online (Sandbox Code Playgroud)

这就是装饰者的作用.但是,C是什么样的?从我看到的一些小样本代码,不知何故C受A影响,因为A改变B和B改变C.但我有两个问题理解这个:

  1. C.的确切性质是它C = A(B)(C)还是C = A(B(C))
  2. 如果C确实受到A的影响,那么为什么在运行上述代码时只打印一次'blah'?

个人猜测

其实,现在我已经输入出来,我推测,发生的事情是,我们首先得到: B = A(B) C = B(C).这意味着总体而言,我们得到了C = A(B)(C),它将解释为什么'blah'只打印一次.

但我确信这是最好的.

Amb*_*ber 6

你的个人猜测是正确的.

当定义@-line及其后续函数定义时,在定义时"调用"装饰器.

@foo
def bar():
    pass
Run Code Online (Sandbox Code Playgroud)

只是...的语法糖

def bar():
    pass
bar = foo(bar)
Run Code Online (Sandbox Code Playgroud)