




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一文詳解如何創建自己的Python裝飾器目錄1、@staticmethod2、自定義裝飾器3、帶參數的裝飾器python裝飾器在平常的python編程中用到的還是很多的,在本篇文章中我們先來介紹一下python中最常使用的@staticmethod裝飾器的使用。
之后,我們會使用兩種不同的方式來創建自己的自定義python裝飾器以及如何在其他地方進行調用。
1、@staticmethod
@staticmethod是python開發者經常用來在一個類中聲明該函數是一個靜態函數時使用到的裝飾器,比如創建一個HelloWorld的python類,并且在其中使用該靜態裝飾器聲明其中的函數。
classHelloWorld():
def__init__(self):
super(HelloWorld,self).__init__()
@staticmethod
defprint_hello_world():
print('welcometohelloworld!')
@staticmethod裝飾器一般是對于一些公共的函數,或是工具函數之類的函數進行聲明,聲明之后就不會將當前python類中的初始化變量信息等傳入到該函數中,可以看到print_hello_world函數并沒有self作為參數變量。
接下來可以在初始化@staticmethod聲明的函數所在的類HelloWorld,并且調用print_hello_world函數。
hello_world=HelloWorld()
hello_world.print_hello_world()
會發現控制臺直接打印出了welcometohelloworld!這行字符串。
實際上在python中的函數上面加入裝飾器只是為了在執行當前函數的邏輯之前去執行一些我們需要執行的業務功能,這樣的操作我們通過自定義自己的裝飾器也能夠實現同樣的效果。
2、自定義裝飾器
其實,自定義裝飾器的過程也比較簡單,就是我們平常用到的函數或者python類的寫法就能夠實現。
自己實現裝飾器主要有兩種方式,一種是通過class類的方式來實現的,另外一種則是通過python函數嵌套的方式來實現的,下面我們先來通過第一種的方式來實現,也就是通過python類的方式來實現。
python類實現裝飾器
用python類來實現裝飾器時,必須明白一個知識點。python類中實際上默認有一個成員函數__call__,這個成員函數就是這個類被調用時的函數對象,若是需要自定義裝飾器實際上就是在python類的__call__函數中來實現裝飾器主要業務邏輯實現的。
classprint_message(object):
def__init__(self,function_):
self.function_=function_
def__call__(self):
#TODO:這里實際上是對傳入的函數返回值進行的裝飾,可以理解成是一種回調。
print('裝飾器,{}'.format(self.function_()))
注意:在下面這行代碼塊中一定要注意self.function_是一個函數對象,而self.function_()是一個函數返回值得效果。
print('裝飾器,{}'.format(self.function_()))
這樣,我們通過python類就已經實現了python裝飾器的效果,使用一個函數來試驗一下效果。
@print_message
defhello_world():
return'helloworld!'
hello_world()
調用使用了@print_message裝飾器的函數,它會返回我們預期的一個函數結果的打印。
python函數嵌套實現裝飾器
上面的操作過程是通過重新定義了一個python類來實現裝飾器的效果的,這里再使用函數嵌套的方式來實現。
因為,我們都知道在python中函數中再可以嵌套函數的,在函數中嵌套一個函數時上層的函數相對于子函數來說就是它的一個父級對象。
@print_message2
@print_message
defhello_world3():
return'helloworld!'
hello_world3()
#裝飾器,helloworld!
#裝飾器2,None
使用函數嵌套的方式同樣實現了函數的裝飾器的效果,那么思考一下若是有兩個裝飾器可以在同一個函數中使用嗎?
多個裝飾器調用
話不多說,為了證明兩個裝飾器能不能放到一個函數上面使用,我們直接試一下效果如何。
@print_message2
@print_message
defhello_world3():
return'helloworld!'
hello_world3()
#裝飾器,helloworld!
#裝飾器2,None
從返回結果來看,首先是兩個裝飾器都是執行了,從數據結果打印的順序來看自定義的裝飾器的執行順序應該是從距離函數最近的裝飾器開始執行的,也就是從下往上的順序挨個執行該函數上面的裝飾器的.
另外,裝飾器2的結果為None,這是為什么呢
因為,第一個裝飾器執行的時候,它的參數應該是hello_world函數本身,但是當第二個裝飾器執行的時候第一個裝飾器并沒有返回結果知識做了打印,這個時候第二個裝飾器接收到的參數自然就是None了。
3、帶參數的裝飾器
說實話帶參數的裝飾器在python中我見到的不多,不多在java中幾乎只要是裝飾器都是可以加參數執行的。
還是來介紹一下,算是屬于擴展知識吧,既然已經看到了這里,不妨再多掌握個小技能吧,哈哈~
我們使用pytgon嵌套的函數功能來實現這個帶參數的裝飾器吧,個人覺得這種方便一些。
defheader(message):
defdecorator(function_):
defwrapper():
return'帶參數的裝飾器,參數:{0},{1}'.format(message,function_())
returnwrapper
returndecorator
@header('Python集中營')
defhello_world4():
return'helloworld!'
print(hello_world4())
#帶參數的裝飾器,參數:Python集中營,helloworld!
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軌道交通工程保證措施
- 護士職業倦怠防控目標及工作計劃
- 電子廢棄物回收環境保護管理措施
- 蘇教版六年級數學下冊總復習計劃
- 2025年河南名校聯盟物理高一下期末達標檢測試題含解析
- 婦產科安全生產培訓工作計劃
- 2025屆青海省西寧市沛西中學物理高二第二學期期末統考模擬試題含解析
- 信息技術驅動數學德育滲透計劃
- 科級干部綜合素質培訓心得體會
- 千枚巖棄渣側限壓縮特性與顆粒重構三維結構模型研究
- 天門山污水處理廠二期擴建項目環境影響報告書
- 婦產科學 妊娠合并心臟病
- -衛生資格-副高-疾病控制-副高-章節練習-慢性非傳染性疾病控制-試題(單選題)(共1125題)
- 骨質疏松病人的護理
- 高中英語全國高考考綱詞匯3600匯總
- GB/T 35068-2018油氣管道運行規范
- GB/T 13277.7-2021壓縮空氣第7部分:活性微生物含量測量方法
- 2023年婁底冷水江市廣播電視臺(融媒體中心)招聘筆試模擬試題及答案解析
- 特勞特戰略定位總裁課程課件
- 陳寶光-TTT課程開發與設計(講義)V2.1
- 六年級開學主題班會課件
評論
0/150
提交評論