Python裝飾器詳細介紹
說在前邊
裝飾器作為Python中的一個比較實用的東西,在我們?nèi)粘斓氖褂眠^程中經(jīng)常使用。但是其細節(jié)問題我們卻常常忘記考慮,本文章就此問題寫建裝飾器代碼來進行一步一步分析。
裝飾器實驗
1.我們常見的裝飾器使用方式
from functools import wraps def test_wrapper(func): @wraps(func) def inner_wrapper(): print("Use inner_wrapper") func() return inner_wrapper @test_wrapper def func2(): print("Use func2")
2.裝飾器可以進一步簡化,留下最重要的部分
def test_wrapper2(func): def inner_wrapper(): pass return inner_wrapper @test_wrapper2 def func3(): pass
調(diào)用func3()發(fā)現(xiàn)輸出為空。
那我們便可以看出裝飾器的實際運作方式
python解釋器會call這個被@的函數(shù)名稱,并向其中傳入被裝飾函數(shù)名稱,例
def A(func): pass @A def func(): pass func() """ 就相當于是 把func()的調(diào)用 換成了A(func)(),故這里A函數(shù)返回的一定是一個可以被調(diào)用(call)的函數(shù),否則會報錯 """
3.研究深入,向裝飾器中傳入值
from functools import wraps # 在裝飾器中使用額外參數(shù) def another_keyword(another_keyword=None): def test_func(func): @wraps(func) def func_wrapper(): if another_keyword == 1: print("Use another_keyword") else: print("Not use another_keyword") print("Using func_wrapper") func() return func_wrapper return test_func @another_keyword(another_keyword=1) def func(): print("Use func")
根據(jù)上方的分析,我們這次在調(diào)用func這個函數(shù)的時候就相當于以下流程
another_keyword(another_keyword=1)(func)()
可能有點復雜,需要再進行思考,不過接下來我們會使用一種更適合傳參的裝飾器
4.更加強大,用類實現(xiàn)裝飾器
from functools import wraps class cls_wrapper(object): def __init__(self): pass def __call__(self, func): @wraps(func) def inner_wrapper(): func() return inner_wrapper @cls_wrapper() def func4(): print("Use func4")
在一個類中,我們定義了__call__方法,也就是說,這個類的實例可以像函數(shù)一樣被調(diào)用,我們只需要實例化這個類就可以當做裝飾器使用了。
這樣做的好處是,我們在實例化類的時候,可以傳入初始化的參數(shù),就不用向上邊那樣對函數(shù)進行層層閉包了。
到此這篇關(guān)于Python裝飾器詳細介紹的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python中__new__和__init__的區(qū)別與聯(lián)系
在Python中,每個對象都有兩個特殊的方法:__new__和__init__,本文將詳細介紹這兩個方法的不同之處以及它們之間的聯(lián)系,具有一定的參考價值,感興趣的可以了解一下2023-12-12Django配置MySQL數(shù)據(jù)庫的完整步驟
這篇文章主要給大家介紹了關(guān)于Django配置MySQL數(shù)據(jù)庫的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學習或者使用django具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09python 點云地面點濾波-progressive TIN densification(PTD)算法介紹
關(guān)于地面點濾波的概念我們要與孤立點(outlier)濾波區(qū)分開,孤立點濾波可以理解為圖像中的去噪,去除數(shù)據(jù)測量過程中受到飛鳥、多路徑效應所產(chǎn)生的遠低于/高于其他數(shù)據(jù)的點。今天通過本文給大家分享python PTD點云地面點濾波的相關(guān)知識,一起看看吧2021-08-08Pygame游戲開發(fā)之太空射擊實戰(zhàn)碰撞改進篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學習中回顧過往展望未來,在本課中,我們將討論如何更改?Pygame?處理精靈之間沖突的方式2022-08-08