摘要:首先要搞清楚什么是裝飾器簡單來說,可以把裝飾器理解為一個包裝函數(shù)的函數(shù),在函數(shù)運行時增加功能但不影響這個函數(shù)原有內(nèi)容,還可以進(jìn)行函數(shù)執(zhí)行后的清理工作。
原文地址
https:nolon.xyz
在學(xué)習(xí)python過程中,相信大家對裝飾器的概念很模糊,我也是困惑了很久,決定寫一篇文章梳理一下。首先要搞清楚什么是裝飾器:
簡單來說,可以把裝飾器理解為一個包裝函數(shù)的函數(shù),在函數(shù)運行時增加功能但不影響這個函數(shù)原有內(nèi)容,還可以進(jìn)行函數(shù)執(zhí)行后的清理工作。
舉一個小例子
@func1 def func2(): pass
裝飾器做的事情就是func1(func2) 傳遞了一個函數(shù)對象到我們的裝飾器里面然后先執(zhí)行裝飾器func1其中的內(nèi)容,然后再執(zhí)行函數(shù)func2。
比如舉一個普通裝飾器的例子
#普通裝飾器 def func1(func): def add_func(): print("這是我要添加的功能") return func() return add_func @func1 def func2(): print("hello world") #func1裝飾器函數(shù) #func2被裝飾的函數(shù) >>>func2() 這是我要添加的功能 hello world
在這段代碼中func2()相當(dāng)于func1(func2)()->add_func(),再想要執(zhí)行func2()函數(shù)時,先執(zhí)行裝飾器func1()函數(shù),并且參數(shù)func相當(dāng)于func2()。執(zhí)行func1函數(shù)時由于返回值是add_func,我們執(zhí)行的是func1(func2)(),也就相當(dāng)于執(zhí)行add_func(),輸出
"這是我添加的功能",返回一個func()函數(shù),也就是參數(shù)func的調(diào)用,即對應(yīng)的func2函數(shù)的調(diào)用。
def func1(func): def func2(): return func() return func1()進(jìn)階
來一個帶參數(shù)的裝飾器吧
def func1(func): def func2(a,b): a=1 b=2 return func(a,b) return func() @func1 def func(x,y) print("this is a add func") print(x+y) >>>func(10,20) this is a add func 3
自這段代碼中被裝飾函數(shù)的參數(shù)傳遞到裝飾函數(shù)的變量中,也就是x傳遞給了a,y傳遞給了b,return func(a,b)即調(diào)用了func函數(shù)并且函數(shù)的參數(shù)為a和b。
再高級一點的 裝飾器函數(shù)帶參數(shù) (哈哈,是不是感覺有點懵了)
def arg_func(arg): def _func(func): def _func1(): if arg=="good": print("出去玩") if arg=="bad": print("不出去玩") return func() return _func1 return _func @arg_func("bad") def func(): print("bad day") @arg_func("good") def func1() print("good day") >>>func() 不出去玩 bad day >>>func1() 出去玩 good day
這段代碼其實很簡單,就是裝飾器多了一個參數(shù)用來判斷,看上去也很好理解。同樣,執(zhí)行func裝飾器接收函數(shù)(arg_func)的參數(shù)是bad,執(zhí)行func1函數(shù),裝飾器接收函數(shù)的參數(shù)是good
好了,到這里,裝飾器的內(nèi)容基本上就梳理完了,肯定還有不全的地方或者不好的地方,希望小伙伴們可以多多完善,有需要補充的或者需要改正的在下面留言告訴我哦 ( ?? ω ?? )y!文章地址:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42852.html
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡單的裝飾器基于上面的函數(shù)執(zhí)行時間的需求,我們就手寫一個簡單的裝飾器進(jìn)行實現(xiàn)。函數(shù)體就是要實現(xiàn)裝飾器的內(nèi)容。類裝飾器的實現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:希望引以為戒鄭傳裝飾模式如果你了解,你肯定聽過裝飾器模式。在面向?qū)ο笾?,裝飾模式指動態(tài)地給一個對象添加一些額外的職責(zé)。就增加一些功能來說,裝飾模式比生成子類更為靈活。 漫談 如果作為一個Python入門,不了解Python裝飾器也沒什么,但是如果作為一個中級Python開發(fā)人員,如果再不對python裝飾器熟稔于心的話,那么可能并沒有量變積累到質(zhì)變。 我以前也看過很多講python 裝...
摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡化上面的寫法像上面的情況,可以動態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標(biāo)題為會打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...
摘要:初步認(rèn)識裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時運行。只有涉及嵌套函數(shù)時才有閉包問題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫中的裝飾器。 《流暢的Python》筆記本篇將從最簡單的裝飾器開始,逐漸深入到閉包的概念,然后實現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫中常用的裝飾器。 1. 初步認(rèn)識裝飾器 函數(shù)裝飾...
摘要:變量查找規(guī)則在中一個變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點: 1、掌握裝飾器的本質(zhì)、功...
閱讀 790·2021-11-09 09:47
閱讀 1581·2019-08-30 15:44
閱讀 1150·2019-08-26 13:46
閱讀 2114·2019-08-26 13:41
閱讀 1279·2019-08-26 13:32
閱讀 3783·2019-08-26 10:35
閱讀 3532·2019-08-23 17:16
閱讀 462·2019-08-23 17:07