2011-01-27 65 views
1
def my_decorator(func) : 
    print "I am a ordinary function" 
    def wrapper() : 
     print "I am function returned by the decorator" 
     func() 
    return wrapper 
def lazy_function() : 
    print "zzzzzzzz" 

functionDecorator=my_decorator(lazy_function) 

我在調試IO問題與裝飾

I am a ordinary function 

我不明白爲什麼會有任何輸出。我明白爲什麼這條線:

functionDecorator() 

返回我:

I am function returned by the decorator 
another___zzzzzzzz 

但其餘我想我錯過了什麼

+2

您正在調用`my_decorator()`,因此它會被執行。這個函數沒什麼特別之處 - 它就像你調用的任何函數一樣執行。 – 2011-01-27 15:04:45

回答

5

當您第一次致電my_decorator時,在它返回函數wrapper之前,它將打印您的消息。

嘗試再次調用functionDecorator(),您將不會再次獲得輸出,因爲該功能已被my_decorator修飾。但是,每次調用my_decorator時,它都會打印您的消息,因爲它是一個正常的函數調用(碰巧還會返回一個裝飾函數)。

此外,請參閱http://www.python.org/dev/peps/pep-0318/#current-syntax以獲取實現裝飾器的替代語法。

4

裝飾是一個正常功能,這需要另一個函數,返回一些修改功能。

當你撥打:

functionDecorator=my_decorator(lazy_function) 

你的裝飾內碼立即執行,所以打印語句執行,創建並返回新的功能。然後,當你運行裝飾函數(這是一個簡單的裝飾器內建的新函數)時,只執行內部打印並且外部不再被執行。明白了嗎?