python裝飾器"@"使用實(shí)例深入探究
基礎(chǔ)語法
裝飾器是 Python 中一種強(qiáng)大且靈活的特性,用于修改或擴(kuò)展函數(shù)或方法的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接收一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù)或可調(diào)用對(duì)象。
舉例:
def funA(func):
def wrapper():
print("itmatou")
func()
print("itmatou2")
return wrapper
@funA
def funB():
print("Hello!")
funB()其輸出結(jié)果為:
itmatou
Hello!
itmatou2
分析:
在這個(gè)例子中,funA 是一個(gè)簡(jiǎn)單的裝飾器函數(shù),它接收一個(gè)函數(shù) func,然后返回一個(gè)新的函數(shù) wrapper。通過在 funB 函數(shù)定義上使用 @funA 語法,實(shí)際上相當(dāng)于執(zhí)行了 funB = funA(funB)。調(diào)用 funB 時(shí),實(shí)際上是調(diào)用了 wrapper 函數(shù)。
- 將 funB 作為參數(shù)傳給 funA 函數(shù);
- 將 funA 函數(shù)執(zhí)行完成的返回值反饋回 funB。
- 等價(jià)于:funB = funA(funB)
帶參數(shù)的裝飾器
funB() 函數(shù)無參數(shù)時(shí),直接將 funB() 作為 funA() 的參數(shù)傳入。如果當(dāng) funB() 函數(shù)帶有參數(shù)時(shí),應(yīng)該如何傳值那?
舉例:
def funA(func):
def wrapper(say):
print("itmatou:", say)
return wrapper
@funA
def funB(say):
print("Hello!")
funB("hello")其輸出結(jié)果為:
itmatou: hello
在實(shí)際應(yīng)用中,裝飾器 funA 是提前寫好的,并不確認(rèn)調(diào)用它的函數(shù)帶有幾個(gè)參數(shù),所以這里用到*args, **kwargs
*args是一個(gè)特殊的參數(shù),在函數(shù)定義時(shí)以星號(hào)開頭,用于傳遞不確定數(shù)量的位置參數(shù)。作為一個(gè)元組(tuple)處理。
**kwargs是另一個(gè)特殊的參數(shù),在函數(shù)定義時(shí)以兩個(gè)星號(hào)開頭,用于傳遞不確定數(shù)量的關(guān)鍵字參數(shù)。作為一個(gè)字典(dict)來處理。
舉例:
def funA(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
@funA
def funB(say):
print("Hello!", say)
@funA
def funC(say, say1):
print("Hello!", say, say1)
funB("我是B")
funC("我是C", "CC")其輸出結(jié)果為:
Hello! 我是B
Hello! 我是C CC
裝飾器本身也可以接收參數(shù):
舉例:
def funA_with_args(arg):
def funA(func):
def wrapper(*args, **kwargs):
print(arg)
func(*args, **kwargs)
return wrapper
return funA
@funA_with_args("我是裝飾器自帶的參數(shù)")
def funB(say):
print("Hello!", say)
funB("我是B")其輸出結(jié)果為:
Hello! 我是B
Hello! 我是C CC
函數(shù)裝飾器還可以嵌套:
舉例:
@funA @funB @funC def fun(): ###
其執(zhí)行順序相當(dāng)于:
fun = funA(funB(funC(fun)))
類裝飾器
除了函數(shù)裝飾器,你還可以使用類作為裝飾器。類裝飾器需要實(shí)現(xiàn)__call__方法。
舉例:
class MyDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("itmatou")
self.func(*args, **kwargs)
print("itmatou1")
@MyDecorator
def say_hello():
print("Hello!")
say_hello()其輸出結(jié)果為:
itmatou
Hello!
itmatou1
內(nèi)置裝飾器
Python 還提供了一些內(nèi)置的裝飾器,如 @staticmethod、@classmethod 等,用于修飾靜態(tài)方法和類方法。
class MyClass:
@staticmethod
def static_method():
print("Static method.")
@classmethod
def class_method(cls):
print("Class method.")
MyClass.static_method()
MyClass.class_method()這只是裝飾器的基礎(chǔ),你可以根據(jù)需要使用裝飾器來實(shí)現(xiàn)各種功能,比如性能分析、日志記錄、權(quán)限檢查等。裝飾器是 Python 中非常強(qiáng)大和靈活的工具
以上就是python裝飾器"@"使用實(shí)例深入探究的詳細(xì)內(nèi)容,更多關(guān)于python裝飾器@的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 一文帶你深入理解Python的`functools.lru_cache`裝飾器
- Python?functools凍結(jié)參數(shù)小技巧實(shí)現(xiàn)代碼簡(jiǎn)潔優(yōu)化
- python常用模塊(math itertools functools sys shutil)使用講解
- Python 3.8中實(shí)現(xiàn)functools.cached_property功能
- Python裝飾器類方法擴(kuò)展元類管理實(shí)例探究
- 掌握Python property裝飾器巧妙管理類的屬性
- 一文掌握Python描述符與裝飾器的神奇妙用
- Python functools.lru_cache裝飾器性能提升利器深入探究
相關(guān)文章
如何用python和java分別寫出10道經(jīng)典題(含代碼)
Python與Java在語言特性、性能和應(yīng)用場(chǎng)景上各有優(yōu)勢(shì),下面這篇文章主要介紹了如何用python和java分別寫出10道經(jīng)典題的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-05-05
python實(shí)現(xiàn)一個(gè)點(diǎn)繞另一個(gè)點(diǎn)旋轉(zhuǎn)后的坐標(biāo)
今天小編就為大家分享一篇python實(shí)現(xiàn)一個(gè)點(diǎn)繞另一個(gè)點(diǎn)旋轉(zhuǎn)后的坐標(biāo),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Python和Anaconda的版本對(duì)應(yīng)關(guān)系
這篇文章主要為大家介紹了Python和Anaconda,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
基于Python自制一個(gè)圖片批量處理工具實(shí)現(xiàn)格式統(tǒng)一和大小壓縮
在日常工作和生活中,我們經(jīng)常需要處理大量圖片,今天就給大家分享一款自制的Python圖片批量處理工具,無需復(fù)雜操作,圖形化界面一鍵搞定所有需求2025-11-11
簡(jiǎn)單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動(dòng)機(jī)制,需要的朋友可以參考下2015-11-11
使用Python+OpenCV進(jìn)行卡類型及16位卡號(hào)數(shù)字的OCR功能
本文將使用Python+OpenCV實(shí)現(xiàn)模板匹配算法,以自動(dòng)識(shí)別卡的類型和以及16位卡號(hào)數(shù)字,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-08-08

