




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第Python的@裝飾器的作用小結(jié)我們在編程過程中,常常會遇到這種需求:
比如,我想開發(fā)一款計算器,我已經(jīng)寫好了一堆函數(shù),用于執(zhí)行各種計算,那么我們需要在執(zhí)行各種計算函數(shù)前,首先對輸入的數(shù)據(jù)進行檢查,確保他們必須得是數(shù)值才允許執(zhí)行函數(shù),而不能是字符串;
又如,我想編寫一個用于計算三角形周長、面積、某個角角度的模塊,已經(jīng)寫好幾個函數(shù)用于計算,那么,在執(zhí)行計算前,首先要確保輸入的三條邊長能夠構(gòu)成三角形,再進行計算才有意義;
再比如,我想開發(fā)某款網(wǎng)絡(luò)應(yīng)用,寫了一些函數(shù)用于實現(xiàn)用戶的某些操作,那么,得要先檢查確認該用戶已經(jīng)登錄了,才允許執(zhí)行這些操作。
這些需求,歸納起來,就是,在執(zhí)行主函數(shù)之前,常常要先執(zhí)行某個預函數(shù),進行一些校驗之類的操作。
這類需求是非常常見的,也是保證程序完整性、健壯性的重要舉措。所以,怎么做才比較簡單呢?
你會說,這很簡單啊,在每個函數(shù)里面寫上if語句不就得了。就拿那個計算器而言,如果我們要寫加減乘除,我們可以這樣:
defplus(a,b):
iftype(a)==type(0)andtype(b)==type(0):#假設(shè)該計算器只能計算整數(shù),如果要計算小數(shù)再ortype(0.0)
returna+b
else:
print('Typemustbenumber')#檢測到數(shù)據(jù)類型不對,先輸出報警,函數(shù)值返回None
returnNone
defminus(a,b):
iftype(a)==type(0)andtype(b)==type(0):
returna-b
else:
print('Typemustbenumber')
returnNone
defmultiply(a,b):
iftype(a)==type(0)andtype(b)==type(0):
returna*b
else:
print('Typemustbenumber')
returnNone
defdivide(a,b):
iftype(a)==type(0)andtype(b)==type(0):
returna/b
else:
print('Typemustbenumber')
returnNone
這個嘛,直接暴力。但是呢,這里只有4個函數(shù),假如你開發(fā)的計算器有幾十幾百個函數(shù),每個函數(shù)都要套上if語句,這不得麻煩死了,不煩死也啰嗦死了。
所以怎么弄簡單一點呢?聰明的你肯定想到了,我們可以把那個判斷if也單獨定義一個函數(shù),然后把計算用的函數(shù)套在里面,就像這樣:
defcheck(a,b,func):#定義檢查函數(shù),變量為待檢測參數(shù)a,b和檢測通過后執(zhí)行的函數(shù)func
iftype(a)==type(0)andtype(b)==type(0):
returnfunc(a,b)
else:
print('Typemustbenumber')
returnNone
defplus(a,b):
returna+b
defminus(a,b):
returna-b
check(1,2,plus)#計算1+2
check(1,2,minus)#計算1-2
check(1,2,multiply)#計算1*2
check(1,2,divide)#計算1/2
這里面有一點一定要特別注意,主程序的check(1,2,plus)是把plus函數(shù)本身作為變量傳遞給check,由check函數(shù)決定如何執(zhí)行plus函數(shù),此處不能寫成check(1,2,plus(1,2)),plus不能帶參數(shù)和括號,不是執(zhí)行plus()后把結(jié)果傳給check。
這么寫程序簡潔了不少,加減乘除函數(shù)只需要定義他們本身的運算就可以了,變量檢測交給了check函數(shù)。這么寫也是比較容易理解的。
但是對于使用該程序的用戶來說,就不是這么回事了,他們會覺得這么寫非常難看。
為什么呢?我是要拿程序做加減乘除計算的,但我不論計算什么,每次都是在主調(diào)用check這個函數(shù)!
那有沒有什么辦法,可以既好看,又簡潔呢?裝飾器就是起到了這個神奇的作用。
上面這個需求,用裝飾器可以這么寫:
defcheck(func):
@check
defplus(a,b):
returna+b
@check
defminus(a,b):
returna-b
plus(1,2)#計算1+2
minus(1,2)#計算1-2
先直觀感受一下,通過@check,check函數(shù)就被“注入”到了plus函數(shù)中,使得plus函數(shù)擁有了參數(shù)檢測的功能。這樣,在主程序中,若要計算加法就可直接調(diào)用plus,便可先校驗再計算。
那么,這個裝飾器check要怎么定義呢?我們來看一下。
defcheck(func):#定義裝飾器check
defnewfunc(a,b):#定義函數(shù)模板,即如何處理func
iftype(a)==type(0)andtype(b)==type(0):
returnfunc(a,b)
else:
print('Typemustbenumber!')
returnNone
returnnewfunc#將處理后的func作為新函數(shù)newfunc輸出
@check
defplus(a,b):
returna+b
#主程序,計算1+2
plus(1,2)
我們可以看到,當裝飾器@check作用于plus函數(shù)時,plus函數(shù)本身作為參數(shù)func傳入裝飾器中。在裝飾器check的定義內(nèi)部,定義了一個函數(shù)模板,描述了對輸入的func如何處理。可以看到,newfunc對func(也就是輸入的plus)套用了判斷數(shù)據(jù)類型的if語句,最后,再將套好的newfunc輸出,替代原來的func。這樣,此時執(zhí)行func就是在執(zhí)行newfunc,執(zhí)行plus就是在執(zhí)行套上if語句的新函數(shù)。
所以,通過裝飾器,添加上了判斷語句的新函數(shù)替換了原來的plus函數(shù),但仍通過plus這個函數(shù)名調(diào)用,所以看起來就是plus函數(shù)被“裝飾”了。
當然了,如果大家在網(wǎng)絡(luò)上搜索,關(guān)于如何定義裝飾器,看到的是一個更加規(guī)范的版本??雌饋砀y理解一些,但其實是一樣的:
defcheckall(func):
defwrapper(*args,**kwargs):
iftype(args[0])==type(0)andtype(args[1])==type(0):
returnfunc(*args,**kwargs)
else:
print('Typemustbenumber!')
returnNone
returnwrapper
模板函數(shù)一般習慣用wrapper來表示,這個沒啥,建議大家都這么寫,規(guī)范一些。
參數(shù)一般用不定長的*args,**kwargs來表示,這個可能有些人就困惑了。因為被裝飾的函數(shù)可能有很多種,參數(shù)的個數(shù)一般也不確定。然后*args,**kwargs是什么東西?args,kwargs這兩個形參英文字母是什么無所謂可以自己定,關(guān)鍵是前面的單星號*和雙星號**。
假如我定義一個函數(shù),不能確定參數(shù)有多少個,例如要對輸入的一組數(shù)字做連加操作。那么就可以定義plus(*x),當調(diào)用該函數(shù)時,若輸入多個變量plus(1,2,3),那么就會把輸入的變量組合成一個元祖x=(1,2,3)輸入。定義雙星號plus(**x)的意思是,調(diào)用該函數(shù)時若寫出形參變量plus(a=1,b=2,c=3),那么輸入變量就會組合成字典x={a:1,b:2,c:3}傳入函數(shù)。
當然也可以反向操作,定義函數(shù)的時候參數(shù)個數(shù)是明確的plus(a,b,c),那么調(diào)用該函數(shù)時,加上星號plus(*(1,2,3)),就是對輸入元祖(1,2,3)執(zhí)行炸開操作,轉(zhuǎn)換為plus(1,2,3)輸入。
裝飾器里這么寫有什么用呢?我們仔細觀察一下我們之前寫的newfunc(a,b),那就意味著,指明了新函數(shù)有兩個參數(shù)a,b,假如被裝飾的原函數(shù)有三個參數(shù)怎么辦呢?不就沒用了嗎?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司小股東管理制度
- 公司監(jiān)事會管理制度
- 養(yǎng)狗場衛(wèi)生管理制度
- 發(fā)電廠防汛管理制度
- 地下站設(shè)備管理制度
- 城鎮(zhèn)房屋抗震加固實施方案
- 客服724管理制度
- 陜西省專業(yè)技術(shù)人員繼續(xù)教育2024公需課《專業(yè)技術(shù)人員能力素質(zhì)提升》8學時題庫及答案
- 微商部日常管理制度
- 教師住宿樓管理制度
- 預拌混凝土及原材料檢測理論考試題庫(含答案)
- 3~6歲兒童早期運動游戲干預課程設(shè)計研究-基于SKIP的研究證據(jù)
- 《植物生理學》課件第三章+植物的光合作用
- 游泳館網(wǎng)架翻新施工組織方案設(shè)計
- 3.1 定格青春——向藝術(shù)家學創(chuàng)作 課件-2021-2022學年高中美術(shù)人美版(2019)選修繪畫
- 有機化學所有的命名--超全.
- 引水罐的設(shè)計計算
- 三年級譯林版英語下學期按要求寫句子專項強化練習題
- 電纜接線工藝設(shè)計規(guī)范流程
- 中醫(yī)經(jīng)絡(luò)減肥課件
- 5WHY分析法培訓
評論
0/150
提交評論