簡(jiǎn)單上手Python中裝飾器的使用
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中則定義了對(duì)被裝飾函數(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)層也僅僅是增加了對(duì)外層傳入?yún)?shù)(text)的調(diào)用
總而言之, Python在函數(shù)定義中支持了對(duì)oop思想中的裝飾器的實(shí)現(xiàn), 其本質(zhì)也只是使用了閉包的思路, 延遲調(diào)用, 并在調(diào)用前后增加自己的其他實(shí)現(xiàn)內(nèi)容
- 實(shí)例講解Python編程中@property裝飾器的用法
- Python中使用裝飾器來優(yōu)化尾遞歸的示例
- Python黑魔法@property裝飾器的使用技巧解析
- python中函數(shù)總結(jié)之裝飾器閉包詳解
- 深入理解python中的閉包和裝飾器
- Python的幾個(gè)高級(jí)語法概念淺析(lambda表達(dá)式閉包裝飾器)
- 淺析Python編寫函數(shù)裝飾器
- Python裝飾器基礎(chǔ)詳解
- 分析Python中設(shè)計(jì)模式之Decorator裝飾器模式的要點(diǎn)
- Python裝飾器入門學(xué)習(xí)教程(九步學(xué)習(xí))
- python利用裝飾器進(jìn)行運(yùn)算的實(shí)例分析
- 深入學(xué)習(xí)Python中的裝飾器使用
相關(guān)文章
Python定時(shí)從Mysql提取數(shù)據(jù)存入Redis的實(shí)現(xiàn)
這篇文章主要介紹了Python定時(shí)從Mysql提取數(shù)據(jù)存入Redis的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05探索Python元類與class語句協(xié)議掌握類的控制權(quán)
這篇文章主要介紹了通過Python元類與class語句協(xié)議掌握類的控制權(quán)探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01python:目標(biāo)檢測(cè)模型預(yù)測(cè)準(zhǔn)確度計(jì)算方式(基于IoU)
今天小編就為大家分享一篇python:目標(biāo)檢測(cè)模型預(yù)測(cè)準(zhǔn)確度計(jì)算方式(基于IoU),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01python多版本工具miniconda的配置優(yōu)化實(shí)現(xiàn)
通過Miniconda,您可以輕松地創(chuàng)建和管理多個(gè)Python環(huán)境,同時(shí)確保每個(gè)環(huán)境具有所需的依賴項(xiàng)和軟件包,本文主要介紹了python多版本工具miniconda的配置優(yōu)化實(shí)現(xiàn),感興趣的可以了解一下2024-01-01解決新django中的path不能使用正則表達(dá)式的問題
今天小編就為大家分享一篇解決新django中的path不能使用正則表達(dá)式的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python利用PyPDF2庫獲取PDF文件總頁碼實(shí)例
這篇文章主要介紹了Python利用PyPDF2庫獲取PDF文件總頁碼實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python實(shí)現(xiàn)輕松識(shí)別數(shù)百個(gè)快遞單號(hào)
當(dāng)我們要寄出很多快遞時(shí),為了及時(shí)反饋物流信息,需要盡快將快遞單號(hào)提取出來。這時(shí)用手動(dòng)去識(shí)別真的太麻煩,所以本文將用Python實(shí)現(xiàn)輕松識(shí)別數(shù)百個(gè)快遞單號(hào),需要的可以參考一下2022-06-06