2012-01-07 61 views

回答

7

您最後的代碼片段幾乎是裝飾器的定義。唯一的區別是,在第一種情況下,名稱decor在函數定義之前進行計算,而在第二種情況下,在函數定義之後對其進行計算。如果執行函數定義改變名稱引用的名稱,這隻會有所不同。

無意義例如:

def decor(function): 
    def result(): 
     printf('decorated') 
     return function() 
    return result 

def plonk(): 
    global decor 
    decor = lambda x: x 
    return None 

現在

@decor 
def my_foo(foo=plonk()): 
    print('my_foo') 

是從

def my_foo(foo=plonk()): 
    print('my_foo') 
my_foo = decor(my_foo) 
+0

像往常一樣 - 一個優秀而有見地的例子。 – 2012-01-07 21:14:36

+0

非常感謝您的解釋。這個例子確實很酷;-) – gruszczy 2012-01-08 01:28:11

+0

對不起。但是有人能詳細解釋這個答案嗎?它似乎有一種洞察力,但我不明白它......也許10k +代表只能理解..?! – Aaron 2017-09-26 00:27:37

4

沒有差別。 @decorator語法只是簡單地理解一個裝飾器正在被應用。 (這是syntactic sugar的一個示例。)

1

不同。如果是有差別的,是在此之前的Python 2.4 Python版本不支持@decorator語法,自石器時代以來支持顯式裝飾器調用。此外,@decorator語法必須應用於函數定義,並且必須使用相同的函數名稱,而顯式裝飾器調用稍後可以應用,並且可以重命名裝飾函數。

使用@decorator語法,除非你有一個真的,真的,真的好理由不;這幾乎從來沒有。