Python裝飾器詳細(xì)介紹
說在前邊
裝飾器作為Python中的一個(gè)比較實(shí)用的東西,在我們?nèi)粘?kù)的使用過程中經(jīng)常使用。但是其細(xì)節(jié)問題我們卻常常忘記考慮,本文章就此問題寫建裝飾器代碼來進(jìn)行一步一步分析。
裝飾器實(shí)驗(yàn)
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.裝飾器可以進(jìn)一步簡(jiǎn)化,留下最重要的部分
def test_wrapper2(func): def inner_wrapper(): pass return inner_wrapper @test_wrapper2 def func3(): pass
調(diào)用func3()發(fā)現(xiàn)輸出為空。
那我們便可以看出裝飾器的實(shí)際運(yùn)作方式
python解釋器會(huì)call這個(gè)被@的函數(shù)名稱,并向其中傳入被裝飾函數(shù)名稱,例
def A(func): pass @A def func(): pass func() """ 就相當(dāng)于是 把func()的調(diào)用 換成了A(func)(),故這里A函數(shù)返回的一定是一個(gè)可以被調(diào)用(call)的函數(shù),否則會(huì)報(bào)錯(cuò) """
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這個(gè)函數(shù)的時(shí)候就相當(dāng)于以下流程
another_keyword(another_keyword=1)(func)()
可能有點(diǎn)復(fù)雜,需要再進(jìn)行思考,不過接下來我們會(huì)使用一種更適合傳參的裝飾器
4.更加強(qiáng)大,用類實(shí)現(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")
在一個(gè)類中,我們定義了__call__方法,也就是說,這個(gè)類的實(shí)例可以像函數(shù)一樣被調(diào)用,我們只需要實(shí)例化這個(gè)類就可以當(dāng)做裝飾器使用了。
這樣做的好處是,我們?cè)趯?shí)例化類的時(shí)候,可以傳入初始化的參數(shù),就不用向上邊那樣對(duì)函數(shù)進(jìn)行層層閉包了。
到此這篇關(guān)于Python裝飾器詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python中__new__和__init__的區(qū)別與聯(lián)系
在Python中,每個(gè)對(duì)象都有兩個(gè)特殊的方法:__new__和__init__,本文將詳細(xì)介紹這兩個(gè)方法的不同之處以及它們之間的聯(lián)系,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Django配置MySQL數(shù)據(jù)庫(kù)的完整步驟
這篇文章主要給大家介紹了關(guān)于Django配置MySQL數(shù)據(jù)庫(kù)的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09python 點(diǎn)云地面點(diǎn)濾波-progressive TIN densification(PTD)算法介紹
關(guān)于地面點(diǎn)濾波的概念我們要與孤立點(diǎn)(outlier)濾波區(qū)分開,孤立點(diǎn)濾波可以理解為圖像中的去噪,去除數(shù)據(jù)測(cè)量過程中受到飛鳥、多路徑效應(yīng)所產(chǎn)生的遠(yuǎn)低于/高于其他數(shù)據(jù)的點(diǎn)。今天通過本文給大家分享python PTD點(diǎn)云地面點(diǎn)濾波的相關(guān)知識(shí),一起看看吧2021-08-08怎么用Python識(shí)別手勢(shì)數(shù)字
今天給大家?guī)淼奈恼率窃趺从肞ython識(shí)別手勢(shì)數(shù)字,文中有非常詳細(xì)的圖文示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Python實(shí)現(xiàn)FTP弱口令掃描器的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)FTP弱口令掃描器的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)碰撞改進(jìn)篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動(dòng)手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,在本課中,我們將討論如何更改?Pygame?處理精靈之間沖突的方式2022-08-08