您好,登錄后才能下訂單哦!
這篇文章主要介紹“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裝飾器常用的創建方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。