裝飾器
創(chuàng)新互聯(lián)建站執(zhí)著的堅(jiān)持網(wǎng)站建設(shè),微信小程序開發(fā);我們不會(huì)轉(zhuǎn)行,已經(jīng)持續(xù)穩(wěn)定運(yùn)營(yíng)十年。專業(yè)的技術(shù),豐富的成功經(jīng)驗(yàn)和創(chuàng)作思維,提供一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
裝飾器可以疊加使用,執(zhí)行是從下到上執(zhí)行的
無(wú)參裝飾器@logger
1.它是一個(gè)語(yǔ)法糖
2.函數(shù)作為它 的形參
3.返回值也是一個(gè)函數(shù)
4.可以使用 @function 方式,簡(jiǎn)化調(diào)用
注意: 此處的裝飾器的定義并不準(zhǔn)確,只是方便理解
裝飾器和高階函數(shù)
裝飾器是高階函數(shù),但裝飾器是對(duì)傳入函數(shù)功能的裝飾
裝飾器函數(shù)的演化過(guò)程:
"""
裝飾器
一個(gè)普通的加法函數(shù),想增強(qiáng)他的功能
"""
defadd(x,y):
returnx + y
"""增加信息輸出功能"""
defadd(x,y):
print("call add,x+y")# 日志輸出到控制臺(tái)
returnx + y
"""上面的函數(shù)是完成了需求,但是有缺點(diǎn)
1.print語(yǔ)句的耦合度太高
2.加法函數(shù)屬于業(yè)務(wù)功能,而輸出信息的功能,屬于非業(yè)務(wù)功能代碼,不該放在業(yè)務(wù)函數(shù)加法中"""
"""把添加功能移出來(lái)"""
deflogger(fn):
print("call add,x+y")
ret = fn(3,4)
returnret
print(logger(add))
deflogger(fn,x,y):
print("call add,x+y")
ret = fn(x,y)
returnret
print(logger(add,3,4))
deflogger(fn,*args,**arges):
print("call add,x+y")
ret = fn(*args,**arges)
returnret
print(logger(add,3,4))
deflogger(fn):
defwrapper(*args,**arges):# 可變位置傳參,可變關(guān)鍵字傳參
print("call add,x+y")
ret = fn(*args,**arges)# 參數(shù)解構(gòu)
returnret
returnwrapper
print(logger(add)(4,5))
add = logger(add)# add = wrapper
ret = add(4,5)# wrapper(4,5)
裝飾器 核心思想
importdatetime
deflogger(fn):
defwrapper(*args,**arges):# 可變位置傳參,可變關(guān)鍵字傳參
print("前面增強(qiáng)")
start = datetime.datetime.now()
ret = fn(*args,**arges)# 參數(shù)解構(gòu)
delta = (datetime.datetime.now() - start).total_seconds()
print("so fast")ifdelta <5elseprint("so slow")
print("后面增強(qiáng)")
returnret
returnwrapper
@logger# add = logger(add) => add 就是 wrapper
defadd(x,y):# wrapper(4,5)
returnx + y
ret = add(4,5)# wrapper(4,5) => logger(add)(4,5)
print(ret)
理解裝飾器:
1.裝飾器函數(shù)
2.前置功能增強(qiáng)
3.被增強(qiáng)函數(shù)
4.后置功能增強(qiáng)
deflogger(fn): # 調(diào)用 被裝飾的函數(shù)
defwrapper(*args,**kwargs): # 傳入被裝飾函數(shù)參數(shù)
print("before function") # 前置功能增強(qiáng)
ret = fn(*args,**kwargs) # 使用被裝飾函數(shù)的功能
print("after function") # 后置功能增強(qiáng)
returnret # 返回被裝飾函數(shù)的 計(jì)算結(jié)果
returnwrapper # 返回 被裝飾的函數(shù)
@logger # 無(wú)參裝飾器
# @logger <==> add = logger(add) = wrapper # add(x,y) == wrapper(x,y)
defadd(x,y): # 被裝飾的函數(shù)
returnx + y
add(3,4)
print(add(3,4))
#看似調(diào)用add函數(shù),使用了裝飾器@logger之后,實(shí)際上 調(diào)用的是 wraaper(*args,**kwargs)函數(shù)
當(dāng)前名稱:Python——裝飾器(無(wú)參)
文章地址:http://jinyejixie.com/article42/iiecec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、關(guān)鍵詞優(yōu)化、App設(shè)計(jì)、標(biāo)簽優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)