python裝飾器"@"使用實例深入探究
基礎(chǔ)語法
裝飾器是 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ù)量的關(guān)鍵字參數(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()
這只是裝飾器的基礎(chǔ),你可以根據(jù)需要使用裝飾器來實現(xiàn)各種功能,比如性能分析、日志記錄、權(quán)限檢查等。裝飾器是 Python 中非常強大和靈活的工具
以上就是python裝飾器"@"使用實例深入探究的詳細內(nèi)容,更多關(guān)于python裝飾器@的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python基礎(chǔ)之函數(shù)的定義和調(diào)用
這篇文章主要介紹了python函數(shù)的定義和調(diào)用,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下2021-10-10使用Django xadmin 實現(xiàn)修改時間選擇器為不可輸入狀態(tài)
這篇文章主要介紹了使用Django xadmin 實現(xiàn)修改時間選擇器為不可輸入狀態(tài),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
這篇文章主要為大家介紹了python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05如何通過神經(jīng)網(wǎng)絡(luò)實現(xiàn)線性回歸的擬合
這篇文章主要介紹了如何通過神經(jīng)網(wǎng)絡(luò)實現(xiàn)線性回歸的擬合問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05