網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
python3 最常用的三種裝飾器語(yǔ)法總結(jié)
1.簡(jiǎn)述語(yǔ)法
裝飾器也叫函數(shù)裝飾器,主要作用是在不修改原來(lái)函數(shù)的代碼情況下(函數(shù)本身不會(huì)被修改,執(zhí)行方式也不變化),增加的一個(gè)"裝飾"函數(shù),把原來(lái)的函數(shù)當(dāng)成一個(gè)整體,像傳參一樣給這個(gè)函數(shù)使用,并返回這個(gè)"函數(shù)"。這個(gè)過(guò)程中我們?cè)黾右恍┖瘮?shù)相關(guān)的代碼,當(dāng)函數(shù)被執(zhí)行的時(shí)候,就會(huì)一起執(zhí)行,相當(dāng)于讓函數(shù)增加了更多的功能。
常用的方面:
1.1為函數(shù)增加日志記錄功能:許多函數(shù)寫(xiě)的時(shí)候,并沒(méi)有寫(xiě)日志記錄功能,通過(guò)統(tǒng)一添加日志記錄的裝飾器,就無(wú)需更改代碼,從而實(shí)現(xiàn)記錄的功能。
1.2為函數(shù)實(shí)現(xiàn)驗(yàn)證功能:函數(shù)執(zhí)行的時(shí)候,增加驗(yàn)證是否合規(guī)的裝飾器,這是一些安全的措施,有時(shí)候非常必要。
1.3補(bǔ)救函數(shù)功能:項(xiàng)目結(jié)束后,發(fā)現(xiàn)重大BUG,可以通過(guò)過(guò)增加裝飾器的方式修復(fù),大量降低工作量。
2.不帶參數(shù)的函數(shù)的裝飾器
理解:@符號(hào)就是寫(xiě)一個(gè)裝飾器,最基本的裝飾器,就是寫(xiě)一個(gè)函數(shù),并返回一個(gè)傳入的參數(shù)。本質(zhì)就是把整個(gè)函數(shù)當(dāng)成了參數(shù),并返回,這個(gè)過(guò)程沒(méi)有執(zhí)行函數(shù),只增加了一個(gè)描述信息,如:國(guó)家。
def mycountry(m):
country = "china"
print(country)
return m
@mycountry
def myname():
name = "chengruofei"
print(name)
return name
myname()
執(zhí)行結(jié)果:
python myname.py?
china
chengruofei
備注:
把@符號(hào)理解成省略了第一步的賦值,會(huì)不會(huì)豁然開(kāi)朗:
myname = mycountry(myname)
myname()
3.帶參數(shù)的函數(shù)的裝飾器
**理解:**只需要在裝飾器函數(shù)中,增加一個(gè)函數(shù),并且里面一定要組合傳入的“兩個(gè)參數(shù)”為新的函數(shù),此時(shí)返回值就變成了構(gòu)造的函數(shù)。
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
@mycountry
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執(zhí)行結(jié)果:
china
chengruofei
('I am a :', 'boy')
TEST boy
備注:
通過(guò)裝飾器的函數(shù)返回值,就丟失了。
4.帶參數(shù)的裝飾器
**理解:**本來(lái)裝飾器是沒(méi)有參數(shù)的,參數(shù)是根據(jù)函數(shù)的定義與否去設(shè)定的。但是有時(shí)候裝飾器是個(gè)復(fù)雜的函數(shù),集合了大量的功能,就需要帶入?yún)?shù)去執(zhí)行合適的裝飾器函數(shù)。只需要在原本的解釋器外層加上一層函數(shù),并將中間層函數(shù)作為整體返回。
def myID(i):
if i == 'mycountry':
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return mycountry
else:
def myschool(m):
school = "shijiazhuangjisuanjizhiyejishuxueyuan"
print("I graduated from ",school)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return myschool
@myID('myschool')
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執(zhí)行結(jié)果:
('I graduated from ', 'shijiazhuangjisuanjizhiyejishuxueyuan')
chengruofei
('I am a :', 'boy')
TEST boy
原文鏈接:https://blog.csdn.net/ChengRuoFei/article/details/125487186
相關(guān)推薦
- 2022-04-27 Python基礎(chǔ)學(xué)習(xí)之認(rèn)識(shí)線程_python
- 2022-11-28 一文帶你搞懂Golang結(jié)構(gòu)體內(nèi)存布局_Golang
- 2022-11-25 Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串_Golang
- 2023-07-25 node項(xiàng)目使用crypto模塊為用戶(hù)密碼加密
- 2022-07-26 更新kali源并,安裝dirseach
- 2022-10-01 Python函數(shù)參數(shù)基礎(chǔ)介紹及示例_python
- 2023-01-23 React新擴(kuò)展函數(shù)setState與lazyLoad及hook介紹_React
- 2023-02-10 C++?stack與queue使用方法詳細(xì)講解_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支