嵌套的python装饰器?

时间:2012-06-27 03:54:18

标签: python decorator

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

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

假设我有以下代码:

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

@A
def B(f):
    return f

@B
def C():
    pass

现在,据我所知,从上面的代码中,装饰器导致B变为:

B = A(B)

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

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

    实际上,现在我输入了它,我假设发生的事情是我们先得到的: B = A(B)然后 C = B(C)。这意味着总的来说,我们得到C = A(B)(C),这就解释了为什么'blah'只打印一次。

    但我最好确定一下。

1 个答案:

答案 0 :(得分:6)

您的个人猜测是正确的。

当评估@ - 行及其后续函数定义时,在定义时“调用”装饰器。

@foo
def bar():
    pass

只是......的语法糖。

def bar():
    pass
bar = foo(bar)