因困擾自己多時,打算整理一下修飾器到底是什麼? 參考資料:http://python.jobbole.com/82344/ 修飾器 1. 定義2個函數 2. 基本實現 3. 問題:實現後, 要修改原來代碼中的變量名, funcB()改爲funcA(funcB) 4. 解決方法:讓funcB賦值等於funcA(funcB),用時就是funcB(), 不用修改原來代碼, 這個要求需funcA(funcB)返回的是一個函數 a) 所以要返回一個函數,則加一個函數 wrapper(),然後return 函數; 將原來代碼寫進wrapper(),方便多次調用 5. python的語法糖@, funcB = funcA(funcB),@funcA, 簡寫代碼, 注意寫對位置,寫在要funcB()的前面 基本實現 def funcA(func): print('這是11111111') funcB_copy = func() return funcB_copy def funcB(): print('這是2222222222') funcA(funcB) funcB() # 1. 問題:實現後, 要修改原來代碼中的變量名, funcB()改爲funcA(funcB) # 2. 解決方法:讓funcB賦值等於funcA(funcB),用時就是funcB(), 不用修改原來代碼, 這個要求需funcA(funcB)返回的是一個函數 # 所以要返回一個函數,則加一個函數 wrapper(),然後return 函數; 將原來代碼寫進wrapper(),方便多次調用 def funcA(func): def wrapper(): print('這是11111111') funcB_copy = func() return funcB_copy return wrapper def funcB(): print('這是2222222222') funcB = funcA(funcB) #這是func2 = wrapper()函數 funcA() #func2()執行的是wrapper() 最後python的語法糖@, 將funcB = funcA(funcB)改爲 @funcA,簡寫代碼, 注意寫對位置,寫在funcB()的前面 def funcA(func): def wrapper(): print('這是11111111') funcB_copy = func() return funcB_copy return wrapper @funcA def funcB(): print('這是2222222222') funcB() # 原來是帶參數函數 def funcA(func): def wrapper(a, b): # 注意這裏 print('這是11111111') funcB_copy = func(a, b) #注意這裏 return funcB_copy return wrapper @funcA def funcB(a, b): print('這是2222222222') print(a, b) funcB() 基本調試幾遍就會了 ps:參考資料寫的更好 這篇文章不是轉載,內容也不是原創,我也不知道選什麼(只有原創、轉載、翻譯), 是參考文章的自己理解版,暫時標爲原創,如有不妥請告訴我
python 修飾器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.