真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python——裝飾器(無(wú)參)

裝飾器

創(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ù)


網(wǎng)頁(yè)名稱:Python——裝飾器(無(wú)參)
路徑分享:http://weahome.cn/article/iiecec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部