Python裝飾器詳細介紹
說在前邊
裝飾器作為Python中的一個比較實用的東西,在我們日常庫的使用過程中經常使用。但是其細節(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
調用func3()發(fā)現(xiàn)輸出為空。
那我們便可以看出裝飾器的實際運作方式
python解釋器會call這個被@的函數(shù)名稱,并向其中傳入被裝飾函數(shù)名稱,例
def A(func): pass @A def func(): pass func() """ 就相當于是 把func()的調用 換成了A(func)(),故這里A函數(shù)返回的一定是一個可以被調用(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ù)上方的分析,我們這次在調用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ù)一樣被調用,我們只需要實例化這個類就可以當做裝飾器使用了。
這樣做的好處是,我們在實例化類的時候,可以傳入初始化的參數(shù),就不用向上邊那樣對函數(shù)進行層層閉包了。
到此這篇關于Python裝飾器詳細介紹的文章就介紹到這了,更多相關Python裝飾器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Keras搭建孿生神經網絡Siamese?network比較圖片相似性
這篇文章主要為大家介紹了Keras搭建孿生神經網絡Siamese?network比較圖片相似性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
pytorch之torch_scatter.scatter_max()用法
這篇文章主要介紹了pytorch之torch_scatter.scatter_max()用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Python使用Pandas庫實現(xiàn)MySQL數(shù)據(jù)庫讀寫
本次分享將介紹如何在Python中使用Pandas庫實現(xiàn)MySQL數(shù)據(jù)庫的讀寫,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
基于python3+OpenCV實現(xiàn)人臉和眼睛識別
這篇文章主要為大家詳細介紹了基于python3+OpenCV實現(xiàn)人臉和眼睛識別,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

