python裝飾器"@"使用實例深入探究
基礎語法
裝飾器是 Python 中一種強大且靈活的特性,用于修改或擴展函數(shù)或方法的行為。裝飾器本質(zhì)上是一個函數(shù),它接收一個函數(shù)作為參數(shù),并返回一個新的函數(shù)或可調(diào)用對象。
舉例:
def funA(func):
def wrapper():
print("itmatou")
func()
print("itmatou2")
return wrapper
@funA
def funB():
print("Hello!")
funB()其輸出結(jié)果為:
itmatou
Hello!
itmatou2
分析:
在這個例子中,funA 是一個簡單的裝飾器函數(shù),它接收一個函數(shù) func,然后返回一個新的函數(shù) wrapper。通過在 funB 函數(shù)定義上使用 @funA 語法,實際上相當于執(zhí)行了 funB = funA(funB)。調(diào)用 funB 時,實際上是調(diào)用了 wrapper 函數(shù)。
- 將 funB 作為參數(shù)傳給 funA 函數(shù);
- 將 funA 函數(shù)執(zhí)行完成的返回值反饋回 funB。
- 等價于:funB = funA(funB)
帶參數(shù)的裝飾器
funB() 函數(shù)無參數(shù)時,直接將 funB() 作為 funA() 的參數(shù)傳入。如果當 funB() 函數(shù)帶有參數(shù)時,應該如何傳值那?
舉例:
def funA(func):
def wrapper(say):
print("itmatou:", say)
return wrapper
@funA
def funB(say):
print("Hello!")
funB("hello")其輸出結(jié)果為:
itmatou: hello
在實際應用中,裝飾器 funA 是提前寫好的,并不確認調(diào)用它的函數(shù)帶有幾個參數(shù),所以這里用到*args, **kwargs
*args是一個特殊的參數(shù),在函數(shù)定義時以星號開頭,用于傳遞不確定數(shù)量的位置參數(shù)。作為一個元組(tuple)處理。
**kwargs是另一個特殊的參數(shù),在函數(shù)定義時以兩個星號開頭,用于傳遞不確定數(shù)量的關鍵字參數(shù)。作為一個字典(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í)行順序相當于:
fun = funA(funB(funC(fun)))
類裝飾器
除了函數(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()這只是裝飾器的基礎,你可以根據(jù)需要使用裝飾器來實現(xiàn)各種功能,比如性能分析、日志記錄、權(quán)限檢查等。裝飾器是 Python 中非常強大和靈活的工具
以上就是python裝飾器"@"使用實例深入探究的詳細內(nèi)容,更多關于python裝飾器@的資料請關注腳本之家其它相關文章!
相關文章
如何用python和java分別寫出10道經(jīng)典題(含代碼)
Python與Java在語言特性、性能和應用場景上各有優(yōu)勢,下面這篇文章主要介紹了如何用python和java分別寫出10道經(jīng)典題的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-05-05
python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標
今天小編就為大家分享一篇python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python基于Tkinter實現(xiàn)人員管理系統(tǒng)
這篇文章主要為大家詳細介紹了python基于Tkinter實現(xiàn)人員管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
基于Python自制一個圖片批量處理工具實現(xiàn)格式統(tǒng)一和大小壓縮
在日常工作和生活中,我們經(jīng)常需要處理大量圖片,今天就給大家分享一款自制的Python圖片批量處理工具,無需復雜操作,圖形化界面一鍵搞定所有需求2025-11-11
簡單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動機制,需要的朋友可以參考下2015-11-11
使用Python+OpenCV進行卡類型及16位卡號數(shù)字的OCR功能
本文將使用Python+OpenCV實現(xiàn)模板匹配算法,以自動識別卡的類型和以及16位卡號數(shù)字,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-08-08

