2013-02-27 85 views
1
def decorator(func): 
    def wrapper(func): 
    do something before 
    func() 
    do something later 

    return wrapper 

func =裝飾(func)---->這是我的裝飾功能 func()做裝飾的東西,並給我輸出。包裝方法的意義是什麼?

爲什麼不簡單地裝飾它?

def decorator(func): 

    do something before 
    func() 
    do something later 

decorator(func) 

我能看到的唯一的好處是,在一個情況下,我得到FUNC對象分配和再利用。我想這個問題有點含糊,但我想爲什麼我們需要返回一個函數對象,如果我們的目的只是裝飾?我的意思是什麼的優勢?

+0

「只是裝飾」對你意味着什麼? – BrenBarn 2013-02-27 07:39:07

+0

這個問題也與Python中的函數和變量是如何相關的。通過裝飾,我的意思是在前後做一些事情。 – Nishant 2013-02-28 21:08:24

回答

3

返回一個函數對象重用,如果你想在多個地方使用裝飾函數。

在你的第二個例子中,調用decorator(func)調用func。這意味着如果你想要裝飾者的行爲(即「之前的東西」和「之後的東西」),你必須每次調用decorator(func)

裝飾者的要點是,你實際上做了func = decorator(func),然後永遠在你調用func之後,它會自動調用裝飾器行爲。

+0

完美,重用就是這個詞。將它放在作爲命名對象的範圍內 - 以便我可以重新使用。 – Nishant 2013-02-27 07:39:59

1

考慮裝飾器語法的含義。這:

@decorator 
def say_hi(): 
    print "Hello!" 

是語法糖這樣的:

def say_hi(): 
    print "Hello!" 
say_hi = decorator(say_hi) 

所以,一個裝飾基本上發生在一個函數,並返回一個新的,改進的功能。換句話說,裝修前,say_hi是一個功能;事後,它仍然是一個功能......儘管是一個修改後的功能。

如果裝飾是這樣寫的:

def decorator(fn): 
    return "Something else" 

然後,裝修前,say_hi將是一個功能,但事後,那就得值「別的東西」(字符串),而不是 - 和現在它不再可調用!

+0

正確的話,你可以說,如果你正在返回一個魔法的指示,沒有涉及執行。在另一個你正在返回計算結果。 – Nishant 2013-02-28 21:21:24

相關問題