簡單理解Python中的裝飾器
Python的裝飾器可以實現(xiàn)在代碼運行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作, 而函數(shù)本身并沒有任何的改變。
首先, 我們先定義一個函數(shù), 這個函數(shù)可以輸出我的個人昵稱:
def my_name(): print "Yi_Zhi_Yu" my_name() # Yi_Zhi_Yu
那假如我需要在個人昵稱輸出前, 在輸出我的個人uid呢, 當(dāng)然, 要求是不改動現(xiàn)有的my_name函數(shù), 這個時候就可以使用裝飾器了
首先, 裝飾器也是個函數(shù), 其次, 他需要接受一個參數(shù),該參數(shù)表示了要被裝飾的函數(shù)(即my_name):
def my_info(func): def wrapper(*args, **params): print 218 return func(*args, **params) return wrapper
然后與相應(yīng)的被裝飾函數(shù)關(guān)聯(lián)起來的方法就是使用@my_info寫在被裝飾函數(shù)的前面
@my_info def my_name(): print "Yi_Zhi_Yu"
最后, 在執(zhí)行my_name的時候, 就能既輸出我的uid, 又能輸出我的昵稱了
my_name() #218 #Yi_Zhi_Yu
在上面, 最讓我們疑惑的是裝飾器函數(shù)定義里面的wrapper函數(shù), 裝飾器本身返回的是wrapper函數(shù)的定義, 而wrapper中則定義了對被裝飾函數(shù)(my_name)的調(diào)用, func表示的就是被裝飾函數(shù), 說白了, 裝飾器只是把某個不得改動的函數(shù)(a)放到另一個函數(shù)(b)中, 在b里面調(diào)用a, 在調(diào)用前后就可以做所謂的看起來像裝飾的工作了。
my_info的最終返回的wrapper函數(shù)的定義, 并不是執(zhí)行結(jié)果,只有當(dāng)wrapper真正執(zhí)行的時候, 才會真正的執(zhí)行my_name方法, 這就是閉包時所說的內(nèi)容。
wrapper中的參數(shù), 實際上則是傳遞給func(實際上是my_name)的參數(shù)
因為裝飾器也是個函數(shù), 那么裝飾器自己的能不能有參數(shù)傳遞呢。可以, 不過需要定義一個更高階的函數(shù), 也就是外面還要套一層函數(shù), 比如, 我還要輸出我的自定義的一個信息,需要傳遞參數(shù)
def c_info(text): def my_info(func): def wrapper(*args, **params): print text print 218 return func(*args, **params) return wrapper return my_info
#使用裝飾器 @c_info("Tony") def my_name(): print "Yi_Zhi_Yu" my_name() #Tony #218 #Yi_Zhi_Yu
與前面的那個裝飾器相比, 僅僅是多了個外層, 內(nèi)層也僅僅是增加了對外層傳入?yún)?shù)(text)的調(diào)用
總而言之, Python在函數(shù)定義中支持了對oop思想中的裝飾器的實現(xiàn), 其本質(zhì)也只是使用了閉包的思路, 延遲調(diào)用, 并在調(diào)用前后增加自己的其他實現(xiàn)內(nèi)容
Ps: 以上皆為學(xué)習(xí)筆記, 附帶自己的理解, 難免有偏差, 如有發(fā)現(xiàn)紕漏, 還望指正
相關(guān)文章
使用Python實現(xiàn)NBA球員數(shù)據(jù)查詢小程序功能
這篇文章主要介紹了使用Python實現(xiàn)NBA球員數(shù)據(jù)查詢小程序功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Python argparse中的action=store_true用法小結(jié)
這篇文章主要介紹了Python argparse中的action=store_true用法小結(jié),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02python3.6之xlwt如何設(shè)置單元格對齊方式
這篇文章主要介紹了python3.6之xlwt如何設(shè)置單元格對齊方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06淺談pandas關(guān)于查看庫或依賴庫版本的API原理
本文主要介紹了淺談pandas關(guān)于查看庫或依賴庫版本的API原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06