亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python?裝飾器常用的創(chuàng)建方式及源碼示例解析

 更新時間:2022年04月24日 15:09:31   作者:坨之歌  
裝飾器(decorator)是一種高級Python語法,可以對一個函數(shù)、方法或者類進(jìn)行加工,這篇文章主要介紹了Python?裝飾器常用的創(chuàng)建方式及解析,需要的朋友可以參考下

裝飾器簡介

裝飾器(decorator)是一種高級Python語法??梢詫σ粋€函數(shù)、方法或者類進(jìn)行加工。在Python中,我們有多種方法對函數(shù)和類進(jìn)行加工,相對于其它方式,裝飾器語法簡單,代碼可讀性高。因此,裝飾器在Python項(xiàng)目中有廣泛的應(yīng)用。修飾器經(jīng)常被用于有切面需求的場景,較為經(jīng)典的有插入日志、性能測試、事務(wù)處理, Web權(quán)限校驗(yàn), Cache等。

裝飾器的優(yōu)點(diǎn)是能夠抽離出大量函數(shù)中與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。即,可以將函數(shù)“修飾”為完全不同的行為,可以有效的將業(yè)務(wù)邏輯正交分解。概括的講,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。例如記錄日志,需要對某些函數(shù)進(jìn)行記錄。笨的辦法,每個函數(shù)加入代碼,如果代碼變了,就悲催了。裝飾器的辦法,定義一個專門日志記錄的裝飾器,對需要的函數(shù)進(jìn)行裝飾。

基礎(chǔ)通用裝飾器

源碼示例

def wrapper_out(func):
    print('-- wrapper_out start --')

    def inner(*args, **kwargs):
        print("-- inner start --")
        ret = func(*args, **kwargs)
        print("-- inner end --")
        return ret
    print('-- wrapper_out end --')
    return inner
@wrapper_out
def test():
    print("--test--")
    return 1 * 2
if __name__ == '__main__':
    print(">>>>>>>>>>>>>>")
    print(test())

執(zhí)行結(jié)果

-- wrapper_out start --
-- wrapper_out end --
>>>>>>>>>>>>>>
-- inner start --
--test--
-- inner end --
2

帶參數(shù)裝飾器

源碼示例

def wrapper_out(mode=None):
    print('-- wrapper_out start --')

    def inner_1(func):
        print("-- inner_1 start --")
        def inner_2(*args, **kwargs):
            print("-- inner_2 start --")
            print(f"mode: {mode}")
            ret = func(*args, **kwargs)
            print("-- inner_2 end --")
            return ret
        print("-- inner_2 end --")
        return inner_2
    print('-- wrapper_out end --')
    return inner_1
@wrapper_out(mode=2)
def test():
    print("--test--")
    return 1 * 2
if __name__ == '__main__':
    print(">>>>>>>>>>>>>>")
    print(test())

源碼結(jié)果

-- wrapper_out start --
-- wrapper_out end --
-- inner_1 start --
-- inner_2 end --
>>>>>>>>>>>>>>
-- inner_2 start --
mode: 2
--test--
-- inner_2 end --
2

源碼解析

帶參數(shù)的裝飾器函數(shù), 需要多嵌套一層, 外層裝飾器的參數(shù)

預(yù)加載的時候已經(jīng)是根據(jù)函數(shù)的編寫順序進(jìn)行加載

執(zhí)行順序在對應(yīng)的最內(nèi)存函數(shù)中調(diào)用最外層的裝飾器函數(shù)參數(shù)

被裝飾函數(shù)是最為 inner_1 的參數(shù)進(jìn)行傳入, 被裝飾函數(shù)的參數(shù)是作為 inner_2 的參數(shù)傳入

被裝飾函數(shù)的執(zhí)行位置是在 inner_2 中, 使用inner_1 的參數(shù)變量和 inner_2 的參數(shù)變量共同協(xié)助下進(jìn)行執(zhí)行

同時還要使用裝飾器函數(shù) wrapper_out 的參數(shù)變量進(jìn)行額外的操作

多裝飾器執(zhí)行順序

源碼示例

def wrapper_out1(func):
    print('-- wrapper_out_1 start --')

    def inner1(*args, **kwargs):
        print("-- inner_1 start --")
        ret = func(*args, **kwargs)
        print("-- inner_1 end --")
        return ret
    print('-- wrapper_out1 end --')
    return inner1
def wrapper_out2(func):
    print('-- wrapper_out_2 start --')
    def inner2(*args, **kwargs):
        print("-- inner_2 start --")
        print("-- inner_2 end --")
    print('-- wrapper_out_2 end --')
    return inner2
@wrapper_out2
@wrapper_out1
def test():
    print("--test--")
    return 1 * 2
if __name__ == '__main__':
    print(">>>>>>>>>>>>>>")
    print(test())

執(zhí)行結(jié)果

-- wrapper_out_1 start --
-- wrapper_out1 end --
-- wrapper_out_2 start --
-- wrapper_out_2 end --
>>>>>>>>>>>>>>
-- inner_2 start --
-- inner_1 start --
--test--
-- inner_1 end --
-- inner_2 end --
2

解析

裝飾器的預(yù)加載順序是從上往下, 先將裝飾器函數(shù)寫入內(nèi)存

裝飾器的執(zhí)行順序是以最靠近函數(shù)體的裝飾器開始執(zhí)行(從內(nèi)到外)

類裝飾器

源碼示例

class WrapperOut(object):
    def __init__(self, func):
        print('start init ~~~~~`')
        print('func name is %s ' % func.__name__)
        self.__func = func
        print('end init ~~~~~`')

    def __call__(self, *args, **kwargs):
        print('start test')
        self.__func()
        print('end test')
@WrapperOut
def test():
    print('this is test func')
if __name__ == '__main__':
    print(">>>>>>>>>>>")
    test()

執(zhí)行結(jié)果

start init ~~~~~`
func name is test 
end init ~~~~~`
>>>>>>>>>>>
start test
this is test func
end test

解析

類裝飾器是利用了類初始化 init 析構(gòu)方法來處理 被裝飾函數(shù)的傳入

以及使用 call 方法來滿足被裝飾函數(shù)的執(zhí)行觸發(fā)

到此這篇關(guān)于Python 裝飾器常用的創(chuàng)建方式及解析的文章就介紹到這了,更多相關(guān)python裝飾器創(chuàng)建方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python方差特征過濾的實(shí)例分析

    Python方差特征過濾的實(shí)例分析

    在本篇文章里小編給大家整理了一篇關(guān)于Python方差特征過濾的實(shí)例分析內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-08-08
  • Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內(nèi)容實(shí)例詳解

    Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內(nèi)容實(shí)例詳解

    這篇文章主要介紹了Python3使用騰訊云文字識別(騰訊OCR)提取圖片中的文字內(nèi)容方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python HTMLTestRunner測試報(bào)告view按鈕失效解決方案

    Python HTMLTestRunner測試報(bào)告view按鈕失效解決方案

    這篇文章主要介紹了Python HTMLTestRunner測試報(bào)告view按鈕失效解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Python3實(shí)現(xiàn)抓取javascript動態(tài)生成的html網(wǎng)頁功能示例

    Python3實(shí)現(xiàn)抓取javascript動態(tài)生成的html網(wǎng)頁功能示例

    這篇文章主要介紹了Python3實(shí)現(xiàn)抓取javascript動態(tài)生成的html網(wǎng)頁功能,結(jié)合實(shí)例形式分析了Python3使用selenium庫針對javascript動態(tài)生成的HTML網(wǎng)頁元素進(jìn)行抓取的相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • python中rb含義理解

    python中rb含義理解

    在本篇文章里小編給大家整理的是關(guān)于python中rb含義及用法內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • pyqt5移動鼠標(biāo)顯示坐標(biāo)的方法

    pyqt5移動鼠標(biāo)顯示坐標(biāo)的方法

    今天小編就為大家分享一篇pyqt5移動鼠標(biāo)顯示坐標(biāo)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python處理日期和時間的方法總結(jié)

    Python處理日期和時間的方法總結(jié)

    這篇文章主要介紹了Python時間和日期的處理方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Python Web框架之Django框架Form組件用法詳解

    Python Web框架之Django框架Form組件用法詳解

    這篇文章主要介紹了Python Web框架之Django框架Form組件用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架中各種常用Form組件的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • 使用Python來開發(fā)微信功能

    使用Python來開發(fā)微信功能

    這篇文章主要介紹了使用Python來開發(fā)微信功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • Python數(shù)據(jù)分析之pandas函數(shù)詳解

    Python數(shù)據(jù)分析之pandas函數(shù)詳解

    這篇文章主要介紹了Python數(shù)據(jù)分析之pandas函數(shù)詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的pandas函數(shù)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04

最新評論