2016-02-17 18 views
-1

編輯: 作爲一個練習,我需要在第二個時刻定義一個函數結果的字符串。我雖然關於使用裝飾器,我顯然是錯的;有關如何做的建議?在函數結果前加一個字符串

OLD:

def my_decorator(func): 
    def wrapped(*args, **kwargs): 
     return "hello {0}".format(func(*args, **kwargs)) 
    return wrapped 

@my_decorator 
def myfunc(): 
    return "boy" 

def myfunc(): 
    return "girl" 

if __name__ == "__main__": 

    print(myfunc()) 

這段代碼將打印 「丫頭」,我想它打印 「你好的女孩」。 有什麼辦法可以做到嗎?

+4

你爲什麼要重寫的第一個定義?你的問題的解決方案可能會沿着不這樣做的路線。裝飾者不會像你試圖讓他們工作一樣。 – user2357112

+0

你不能。您可以隨時替換對象,並且您在此處這樣做。您必須在替換名稱時或在調用對象時重新應用裝飾器。 –

+0

我正在做這個練習。我需要在第二個時刻定義一個函數結果的字符串。我雖然關於使用裝飾器,我顯然是錯的;我編輯了問題 – z3d0

回答

1

裝飾器用包裝版本替換函數。如果你再替換它,裝飾版本就不見了。

真的,你不應該這樣做。但請記住,裝飾只是一個包裝;如果你要動態地更換功能,那麼就不要裝點他們擺在首位,只是採用的包裝時,你怎麼稱呼它:如果你明確地將其應用到重新定義的函數

print(my_decorator(myfunc)()) 
+0

謝謝,所以使用裝飾器是我需要做的錯誤方法,我編輯了問題 – z3d0

1

你的裝飾工程,如其他人所說的:

@my_decorator 
def myfunc(): 
    return "boy" 

@my_decorator 
def myfunc(): 
    return "girl" 

if __name__ == "__main__": 

    print(myfunc()) 

如果你不能做到這一點靜態,你仍然可以使用你的裝飾代碼functionlly做到這一點:

def myfunc(): 
    return "spot" 

myfunc = my_decorator(myfunc) 
相關問題