亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 裝飾器整理

系統(tǒng) 1817 0

是什么:

首先,Python裝飾器的作用是:讓被裝飾的函數(shù)在不需要 任何 變化的情況下,增加額外的功能。

為什么:

為什么要用裝飾器呢,直接增加功能不就行了?

因?yàn)橛械某绦蛞呀?jīng)上線或已經(jīng)被使用,那么就不能大批量的修改源代碼,于是就產(chǎn)生了裝飾器。

怎么裝飾:

預(yù)備知識(shí):函數(shù)名和函數(shù)的區(qū)別,即帶括號(hào)和不帶括號(hào)的區(qū)別

1.test1表示的是函數(shù)的內(nèi)存 地址。 可以理解為一個(gè)指向某塊內(nèi)存的標(biāo)簽。

2.test1()就是調(diào)用對(duì)在test1這個(gè)地址的內(nèi)容,即函數(shù)。

3.再通俗的比喻,test1是存折,test1()才是你的錢。

看個(gè)半成品代碼:

            
               import time

 def timer(func):
     def deco():  
         start = time.time()
         func()
         stop = time.time()
         print(stop-start)
     return deco

 test = timer(test)   #1

 def test():
     time.sleep(2)
     print("test is running!")   

 test()               #2
            
          

先執(zhí)行#1,test這個(gè)函數(shù)名傳給timer的func,此時(shí),func就指向了test指向的地址塊了。

Python 裝飾器整理_第1張圖片

下面看timer()這個(gè)函數(shù)的結(jié)構(gòu):大盒子timer()里,有一個(gè)中盒子deco(),中盒子里有一個(gè)小盒子func(),小盒子是通過(guò)傳參傳入的。

接著看,大盒子的返回值是一個(gè)函數(shù)名,即大盒子返回的是中盒子的地址,此時(shí)timer()執(zhí)行完了,帶著返回值回到#1。

此時(shí),test這個(gè)函數(shù)名,被賦值了中盒子deco的地址,也就是說(shuō),test指向了deco()這個(gè)函數(shù)的地址。

來(lái)捋一捋 ,剛才的中盒子deco()中嵌入了小盒子func(),也就是說(shuō),傳入的小盒子包在了中盒子deco()中。

經(jīng)過(guò)這個(gè)過(guò)程,test()函數(shù)指向了deco()函數(shù),【原本的功能包在了里邊,反過(guò)來(lái)說(shuō),test()的功能被擴(kuò)展了。】

?

好,繼續(xù)剛才的代碼,#1執(zhí)行結(jié)束后,執(zhí)行#2,test()函數(shù)就找指向的位置,就找到了中盒子deco()的位置。

最后輸出什么呢?:NameError: name 'test' is not defined。

因?yàn)閠est的定義下載了下邊,執(zhí)行#1的時(shí)候就找不到他的定義。因此把test()的定義挪到#1上邊就行了。

(這么看來(lái),兩個(gè)也不是完全等價(jià))

就會(huì)輸出:

            
              test is running!
2.000791072845459

            
          

成品代碼:

1、我們見(jiàn)到的裝飾器裝什么樣子呢?

            
               import time

 def timer(func):
     def deco():  
         start = time.time()
         func()
         stop = time.time()
         print(stop-start)
     return deco

 @timer                

 def test():
     time.sleep(2)
     print("test is running!")   

 test()               #2
            
          

把test = timer(test)替換成@timer? ?放在def test():的上邊。

2、如果test()本身有參數(shù)怎么寫?依葫蘆畫(huà)瓢吧。改動(dòng)在#3、#4、#5.

            
               import time

 def timer(func):
     def deco(*args, **kwargs):  #3
         start = time.time()
         func(*args, **kwargs)   #4
         stop = time.time()
         print(stop-start)
     return deco

 @timer  
 def test(parameter):           #5
     time.sleep(2)
     print("test is running!")   

 test()               
            
          

3、裝飾器帶參數(shù)

            
              import time

def timer(p):                           #7
    def middl(func):                    #8
        def deco(*args, **kwargs): 
            if p == 'ss':
                start = time.time()
                res = func(*args, **kwargs)
                stop = time.time()
                print(stop-start)
            return res 
        return deco                     #8
    return middl                        #7

@timer('ss')
def test(): #8
    time.sleep(2)
    print("test is running!")   
test() 
            
          

就在timer()和deco()中間在套一層middl()。

此時(shí)@timer(’ss')相當(dāng)于:test?= timer('ss')(test?)?

注意!這里timer后面跟了兩個(gè)括號(hào)。?這是什么意思??
其實(shí)很簡(jiǎn)單,先執(zhí)行timer(‘ss’),返回結(jié)果為middl? ? 即 #7 處標(biāo)注。?
再執(zhí)行middl(test),得到的返回結(jié)果為deco? ? ? ? ? ? ??即 #8?處標(biāo)注。
?

參考1:https://blog.csdn.net/weixin_39541558/article/details/79972104

參考2:https://blog.csdn.net/buster_zr/article/details/81104551

The end.


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美特黄a级猛片a级 | 成人亚洲精品一区二区 | 日韩美在线 | 久久草精品视频 | 亚洲美女网址 | 欧美精品专区免费观看 | 99热国产 | 色综合久久伊人 | 国产一级视频 | 91亚洲精品久久 | 国产成人啪精品视频免费网 | 夜夜操夜夜骑 | 五月婷婷在线观看视频 | 日韩精品在线视频观看 | 年级的后妈妈2中文翻译 | 精品国产一区二区三区不卡在线 | 国产亚洲一欧美一区二区三区 | 九九精彩视频在线观看视频 | 国产在线精品一区二区三区不卡 | 亚洲图片综合区另类图片 | 啪啪综合网 | 青青青免费手机版视频在线观看 | 538在线视频二三区视视频 | 天天操天天射天天舔 | 亚洲欧美香蕉在线日韩精选 | 欧美天天性 | 曰曰啪天天拍视频在线 | 天天色天天操综合网 | 波多野结衣国产精品 | japanese乱子欧美| 欧美高清一区二区三区欧美 | 一级毛片欧美一级日韩黄 | 国内精品久久久久久久星辰影视 | 午夜精品久久久久久久 | 亚洲三级在线免费观看 | 午夜黄色影院 | 国产欧美一区二区久久 | 日日骑夜夜操 | 亚洲国产欧美精品一区二区三区 | 日本嫩小xxxxhd| a国产成人免费视频 |