「python進階」魔術改造之裝飾器

導語

歡迎關注我的程式設計棧,在這裡你將循序漸進的學到python相關知識,如:爬蟲、web框架,資料庫,web前端等。

不需要你轉發+評論什麼的發資料,我也沒有什麼資料給你,你跟著文章敲程式碼即可。

我目前是51CTO微職位輔導老師,如果您想系統的學習也可以聯絡我,當然,你也可以忽視這條廣告

如果你覺得文章對你有幫助:感謝關注我。

python是動態語言,提供了@魔術方法

當需要給已經寫好的函式或方法打補丁時

當需要給寫好的函式附加功能或驗證時(例如:驗證登入)

裝飾器可以不改變函式結構,在函式前加個魔法

@

即可

我們來學習裝飾器吧

「python進階」魔術改造之裝飾器

它是什麼?

補丁

=》給你的函式打補丁

寫這個教程時候,我皮了一下,用

中文作為變數名

,發現居然

可以執行

那麼,這部分我就用中文變數名寫程式碼吧,方便各位理解

下面的中文程式碼都是可以執行的哦!~

被裝飾函式和裝飾器都沒有引數的最簡單裝飾器

被裝飾函式作為一個

引數

傳入裝飾器,在裝飾器內層函式做

補丁處理

,然後這個

引數

被執行,內層被返回。

print(‘被裝飾函式和裝飾器都沒引數’。center(50,‘-’))def 簡單裝飾器(引數): def 內層(): # 補丁處理 print(f‘{引數}被裝飾了’) 變數() print(f‘{引數}補丁打完了’) # 只需要在被裝飾函式執行前打補丁直接return return 內層@簡單裝飾器def 我是個函式(): print(‘lalalallalalal’)我是個函式() #執行被裝飾的函式

被裝飾函式有引數,裝飾器應該怎麼寫?

被裝飾函式作為一個

引數

傳入裝飾器,裝飾器內層接收

被裝飾函式的引數

,在裝飾器內層函式做

補丁處理

,被裝飾函式帶著內層接收的引數執行,內層返回。

print(‘被裝飾函式有引數’。center(50,‘-’))# 被裝飾函式有引數def 中級裝飾器(引數): def 內層(*args,**kwargs): # 不推薦固定引數寫法def 內層(a,b): # 補丁處理 print(f‘{引數}被裝飾了’) 引數(*args,**kwargs) print(f‘{引數}補丁打完了’) return 內層@中級裝飾器def 我帶引數(a,b): print(‘引數a:’,a) print(‘引數b:’,b)我帶引數(‘lmc’,‘wly’)

裝飾器有引數-裝飾器完全體

裝飾器函式的引數

傳入裝飾器第一層,被裝飾函式作為一個

引數

傳入裝飾器第二層,裝飾器第三層接收

被裝飾函式的引數

,在裝飾器第三層做補丁處理,被裝飾函式在此執行,二三層依次被返回

print(‘兩個都有引數’。center(50,‘-’))def 高階裝飾器(*列表引數,**字典引數): # 一般裝飾的引數是固定的寫為: # def 高階裝飾器(a): # 一般不建議裝飾器使用可變引數 print(列表引數) print(字典引數) # 這兩個引數,每層都能用 def 第二層(變數): def 第三層(*args,**kwargs): print(f‘{變數}被裝飾了’) 變數(*args,**kwargs) print(f‘{變數}補丁打完了’) return 第三層 return 第二層@高階裝飾器(‘字串’,12,True,b=3,f=‘aaa’)def 我也帶引數(c,d): print(‘引數c:’,c) print(‘引數d:’,d)我也帶引數(‘1212’,‘de8ug’)

函式可以做裝飾器,類可以嗎?

基於類的裝飾器,需要充分利用類的__call__方法,讓類稱為可呼叫物件(callable)

類裝飾函式

類的__init__初始化函式接收裝飾器的引數,被裝飾函式作為引數傳入類的__call__方法,__call__方法內層接收被裝飾函式的引數,在內層補丁處理後返回

# 用類做裝飾器print(‘用類做裝飾器’。center(50,‘-’))class 類裝飾器(object): def __init__(self,*args,**kwargs): # 裝飾器一般引數固定,請避免使用可變引數 self。列表引數 = args self。字典引數 = kwargs def __call__(self,變數): def 內層(*args,**kwargs): print(f‘{變數}被類裝飾了’) 變數(*args,**kwargs) print(f‘{變數}補丁打完了’) return 內層@類裝飾器(‘lmc’,‘wly’,b=1)def 我用來被類裝飾(a,b): print(‘引數a:’,a) print(‘引數b:’,b)我用來被類裝飾(‘aaaaa’,‘bbbbbbbb’)

類裝飾類

裝飾類__init__接收裝飾類的初始化引數,被裝飾類作為變數傳入裝飾類的__call__方法,裝飾類__call__方法的內層接收被裝飾類的初始化引數,在內層做補丁處理後,返回這個變數並帶上被裝飾類的初始化引數

這個例子就不寫了,看到這裡還不懂的同學可以私信或留言,有空回覆

結語

裝飾器是python必須掌握的內容,有了它,你可以快速的持續開發,打補丁等等。

如果你覺得我的文章對你有用,請關注+收藏+分享哦

你有python學習過程中的問題可以評論留言或私信我共同探討~

【小玩意】H5寫的王校長大戰熱狗

「python進階」魔術改造之裝飾器

一小時弄的,隨便寫了一下,摳圖麻煩些,其他都是常規寫法

私信回覆【飛機大戰】【漢堡】獲取網盤原始碼哦