中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python裝飾器常用的創建方式是什么

發布時間:2022-04-24 16:16:05 來源:億速云 閱讀:142 作者:iii 欄目:開發技術

這篇文章主要介紹“Python裝飾器常用的創建方式是什么”,在日常操作中,相信很多人在Python裝飾器常用的創建方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python裝飾器常用的創建方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

裝飾器簡介

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

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

基礎通用裝飾器

源碼示例

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

執行結果

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

帶參數裝飾器

源碼示例

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

源碼結果

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

源碼解析

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

預加載的時候已經是根據函數的編寫順序進行加載

執行順序在對應的最內存函數中調用最外層的裝飾器函數參數

被裝飾函數是最為 inner_1 的參數進行傳入, 被裝飾函數的參數是作為 inner_2 的參數傳入

被裝飾函數的執行位置是在 inner_2 中, 使用inner_1 的參數變量和 inner_2 的參數變量共同協助下進行執行

同時還要使用裝飾器函數 wrapper_out 的參數變量進行額外的操作

多裝飾器執行順序

源碼示例

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

執行結果

-- 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

解析

裝飾器的預加載順序是從上往下, 先將裝飾器函數寫入內存

裝飾器的執行順序是以最靠近函數體的裝飾器開始執行(從內到外)

類裝飾器

源碼示例

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

執行結果

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

解析

類裝飾器是利用了類初始化 init 析構方法來處理 被裝飾函數的傳入

以及使用 call 方法來滿足被裝飾函數的執行觸發

到此,關于“Python裝飾器常用的創建方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金塔县| 武川县| 宜春市| 崇左市| 新晃| 祁阳县| 洞头县| 香港| 河东区| 桦甸市| 丽江市| 扶风县| 江西省| 法库县| 辽宁省| 客服| 银川市| 资源县| 平定县| 阿拉尔市| 祁门县| 田阳县| 宁明县| 花垣县| 孝感市| 钟祥市| 绍兴县| 蕲春县| 民县| 江源县| 琼中| 江口县| 丽水市| 新河县| 荣昌县| 望江县| 噶尔县| 宁河县| 天气| 兰溪市| 曲周县|