摘要:的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文,即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作,而函數(shù)本身并沒有任何的改變。中的參數(shù),實(shí)際上則是傳遞給實(shí)際上是的參數(shù)因?yàn)檠b飾器也是個(gè)函數(shù),那么裝飾器自己的能不能有參數(shù)傳遞呢。
Python的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作, 而函數(shù)本身并沒有任何的改變。
這個(gè)看起來很復(fù)雜, 實(shí)際上應(yīng)用到了我之前說過的閉包的概念, 仔細(xì)看一看, 其實(shí)并不復(fù)雜。
首先, 我們先定義一個(gè)函數(shù), 這個(gè)函數(shù)可以輸出我的個(gè)人昵稱:
def my_name(): print "Yi_Zhi_Yu" my_name() # Yi_Zhi_Yu
那假如我需要在個(gè)人昵稱輸出前, 在輸出我的個(gè)人uid呢, 當(dāng)然, 要求是不改動(dòng)現(xiàn)有的my_name函數(shù), 這個(gè)時(shí)候就可以使用裝飾器了
首先, 裝飾器也是個(gè)函數(shù), 其次, 他需要接受一個(gè)參數(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的時(shí)候, 就能既輸出我的uid, 又能輸出我的昵稱了
my_name() #218 #Yi_Zhi_Yu
在上面, 最讓我們疑惑的是裝飾器函數(shù)定義里面的wrapper函數(shù), 裝飾器本身返回的是wrapper函數(shù)的定義, 而wrapper中則定義了對被裝飾函數(shù)(my_name)的調(diào)用, func表示的就是被裝飾函數(shù), 說白了, 裝飾器只是把某個(gè)不得改動(dòng)的函數(shù)(a)放到另一個(gè)函數(shù)(b)中, 在b里面調(diào)用a, 在調(diào)用前后就可以做所謂的看起來像裝飾的工作了。
my_info的最終返回的wrapper函數(shù)的定義, 并不是執(zhí)行結(jié)果,只有當(dāng)wrapper真正執(zhí)行的時(shí)候, 才會(huì)真正的執(zhí)行my_name方法, 這就是閉包時(shí)所說的內(nèi)容。
wrapper中的參數(shù), 實(shí)際上則是傳遞給func(實(shí)際上是my_name)的參數(shù)
因?yàn)檠b飾器也是個(gè)函數(shù), 那么裝飾器自己的能不能有參數(shù)傳遞呢。可以, 不過需要定義一個(gè)更高階的函數(shù), 也就是外面還要套一層函數(shù), 比如, 我還要輸出我的自定義的一個(gè)信息,需要傳遞參數(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
與前面的那個(gè)裝飾器相比, 僅僅是多了個(gè)外層, 內(nèi)層也僅僅是增加了對外層傳入?yún)?shù)(text)的調(diào)用
總而言之, Python在函數(shù)定義中支持了對oop思想中的裝飾器的實(shí)現(xiàn), 其本質(zhì)也只是使用了閉包的思路, 延遲調(diào)用, 并在調(diào)用前后增加自己的其他實(shí)現(xiàn)內(nèi)容
Ps: 以上皆為學(xué)習(xí)筆記, 附帶自己的理解, 難免有偏差, 如有發(fā)現(xiàn)紕漏, 還望指正
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37554.html
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡單的裝飾器基于上面的函數(shù)執(zhí)行時(shí)間的需求,我們就手寫一個(gè)簡單的裝飾器進(jìn)行實(shí)現(xiàn)。函數(shù)體就是要實(shí)現(xiàn)裝飾器的內(nèi)容。類裝飾器的實(shí)現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:使用類裝飾器,優(yōu)點(diǎn)是靈活性大,高內(nèi)聚,封裝性。不過不用擔(dān)心,有,本身也是一個(gè)裝飾器,它的作用就是把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息。 showImg(https://segmentfault.com/img/bVbrFWb?w=742&h=484);Python的裝飾器(decorator)是一個(gè)很棒的機(jī)制,也是熟練運(yùn)用Python的必殺技之一。...
摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗(yàn)代碼來判斷用戶是否登錄,然后決定后面的執(zhí)行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發(fā)中經(jīng)常會(huì)用到的一個(gè)功能,也是python語言開發(fā)的基礎(chǔ)知識(shí),如果能夠在程序中合理的使用裝飾器,不僅可以提高開發(fā)效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì) 執(zhí)...
摘要:下面我們一起拋去無關(guān)概念,簡單地理解下的裝飾器。用函數(shù)實(shí)現(xiàn)裝飾器裝飾器要求入?yún)⑹呛瘮?shù)對象,返回值是函數(shù)對象,嵌套函數(shù)完全能勝任。為了對調(diào)用方透明,裝飾器返回的對象要偽裝成被裝飾的函數(shù)。 來源:http://www.lightxue.com/under... ???????Python有大量強(qiáng)大又貼心的特性,如果要列個(gè)最受歡迎排行榜,那么裝飾器絕對會(huì)在其中。???????剛接觸裝飾器,會(huì)...
摘要:前言最近跟著流暢的和學(xué)習(xí),看到裝飾器部分,有些頭大倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有些地方有些矛盾之處在簡單學(xué)習(xí)和實(shí)踐之后,整理出我對裝飾器的理解如下裝飾器的定義在不同語境下,裝飾器有不一樣的含義,我大致認(rèn)為有種定義一種把另一個(gè)對 前言 最近跟著《流暢的Python》和《Python Cookbook》學(xué)習(xí),看到裝飾器部分,有些頭大倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有...
閱讀 2808·2023-04-25 18:06
閱讀 2603·2021-11-22 09:34
閱讀 1697·2021-11-08 13:16
閱讀 1323·2021-09-24 09:47
閱讀 3059·2019-08-30 15:44
閱讀 2784·2019-08-29 17:24
閱讀 2597·2019-08-23 18:37
閱讀 2446·2019-08-23 16:55