2012-06-27 133 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

嗯,似乎我正在反思這一點。現在它只是感覺像「我是如何卡在第一位?」感謝您的幫助。 :) –