2012-06-27 129 views
3

我不知道“嵌套的python装饰器?”是阐明这个问题的正确方法,所以让我知道它不是。嵌套的python装饰器?

无论如何,我在udacity上学了一门课,刚刚遇到一些涉及python装饰器的代码,看起来像伏都教魔法,所以现在我想问一个概括性的问题,看看我能不能找出代码。

假设我有以下代码:

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改变C.但是我有两个问题,理解这一点:

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

个人猜测

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

但我最好确定一下。

+0

你的装饰实际上并没有做任何装饰的功能,让你的第二个例子等同于'B = B'和你的第三个例子与“C = C”相同。 (有印刷物的副作用,但不影响功能。) – kindall

+0

是的,我知道。这只是一个普遍的问题,而且写起来更容易。 :) –

回答

6

您的个人猜测是正确的。

装饰者在定义时被调用,当@-line及其后续函数定义被评估时。

@foo 
def bar(): 
    pass 

只是语法糖...

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

嗯,似乎我正在反思这一点。现在它只是感觉像“我是如何卡在第一位?”感谢您的帮助。 :) –