2017-10-04 134 views
2

在Python中,我對裝飾器有所瞭解。 在我可憐的理解任何裝飾功能與原函數構造一個裝飾funtion投資申報表(最合理,這應該是一個可調用的):在Python中使用參數進行裝飾意味着什麼?

def deco(func): 
    def func_wrapper(name): 
     return func(name)+", how are you?" 
    return func_wrapper 

@deco 
def foo(name): 
    return "Hello "+name 

print(foo("Michael")) 

這給:

Hello Michael, how are you? 

但是,如果一個裝飾器指定連同一個參數:

def deco2(info): 
    def info_decorator(func): 
     def func_wrapper(name): 
      return func(name) + info 
     return func_wrapper 
    return info_decorator 

@deco2(", how are you?") 
def foo2(name): 
    return "Hello "+name 

print(foo2("Regina")) 

給予

Hello Regina, how are you? 

什麼是處理這個裝飾器的「規則」? 它似乎,不用返回foo2的Python首先調用deco2與給定Arg和假設,此調用首先構造一個工廠的裝飾,然後就像之前foo2的傳遞給它的順序返回最終的包裝。然而,在這種情況下,有一個額外的「」涉及(三個而不是兩個),這使我很難確定一般規則。

+2

你的第二個裝飾器相當於:'foo2 = deco2(「,你好嗎?」)(foo2)'放在'foo2'之後。 –

+0

我知道,但在第一種情況下,它只是:foo = deco(foo)'放在foo之後。它是從哪個Python知道添加額外的間接裝飾器的參數? – michael

回答

3

如果您應用修飾符而沒有參數,例如, @foo,那麼裝飾器將正在裝飾的函數作爲它的參數,並且預期將返回將替換裝飾函數的任何可調用函數。

如果您應用修飾器的論點,例如, @foo('bar'),那麼裝飾器預計會返回一個可調用的函數,它將裝飾的函數作爲它的參數,並返回並調用它來代替裝飾的函數。換句話說,沒有參數的修飾器只需要被修飾的函數,但是一個帶參數的修飾器需要它自己的參數它需要獲得某個被修飾的函數的保留。由於裝飾器的參數是任意的,並且沒有任何限制,所以很難提出任何非限制性的規則來解決如何將裝飾器另外傳遞給裝飾器的問題。在這種情況下,應用兩步過程:獲取裝飾器參數,然後返回裝飾器的另一個可調用對象。

+0

然後它按我的預期工作,儘管它有點奇怪...... – michael