python裝飾器"@"使用實(shí)例深入探究
基礎(chǔ)語(yǔ)法
裝飾器是 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。通過(guò)在 funB 函數(shù)定義上使用 @funA 語(yǔ)法,實(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ù)無(wú)參數(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 是提前寫(xiě)好的,并不確認(rèn)調(diào)用它的函數(shù)帶有幾個(gè)參數(shù),所以這里用到*args, **kwargs
*args
是一個(gè)特殊的參數(shù),在函數(shù)定義時(shí)以星號(hào)開(kāi)頭,用于傳遞不確定數(shù)量的位置參數(shù)。作為一個(gè)元組(tuple)處理。
**kwargs
是另一個(gè)特殊的參數(shù),在函數(shù)定義時(shí)以?xún)蓚€(gè)星號(hào)開(kāi)頭,用于傳遞不確定數(shù)量的關(guān)鍵字參數(shù)。作為一個(gè)字典(dict)來(lái)處理。
舉例:
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)))
類(lèi)裝飾器
除了函數(shù)裝飾器,你還可以使用類(lèi)作為裝飾器。類(lèi)裝飾器需要實(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)方法和類(lè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ù)需要使用裝飾器來(lái)實(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裝飾器類(lèi)方法擴(kuò)展元類(lèi)管理實(shí)例探究
- 掌握Python property裝飾器巧妙管理類(lèi)的屬性
- 一文掌握Python描述符與裝飾器的神奇妙用
- Python functools.lru_cache裝飾器性能提升利器深入探究
相關(guān)文章
Scrapy爬蟲(chóng)框架集成selenium及全面詳細(xì)講解
這篇文章主要為大家介紹了Scrapy集成selenium,以及scarpy爬蟲(chóng)框架全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04python基礎(chǔ)之函數(shù)的定義和調(diào)用
這篇文章主要介紹了python函數(shù)的定義和調(diào)用,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10使用Django xadmin 實(shí)現(xiàn)修改時(shí)間選擇器為不可輸入狀態(tài)
這篇文章主要介紹了使用Django xadmin 實(shí)現(xiàn)修改時(shí)間選擇器為不可輸入狀態(tài),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lá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,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05如何通過(guò)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合
這篇文章主要介紹了如何通過(guò)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05如何用Python中19行代碼把照片寫(xiě)入到Excel中
這篇文章主要介紹了如何利用Python3中的19行代碼把照片寫(xiě)入到Excel中,文章內(nèi)容實(shí)現(xiàn)的不是截取一張圖片,粘貼到excel,而是通過(guò)像素寫(xiě)入到excel中,需要的朋友可以參考一下2022-02-02python3實(shí)現(xiàn)名片管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11