第二十九節,裝飾器python
裝飾器簡介函數
裝飾器,用於裝飾某個函數,或者方法,或者類
裝飾能夠用於某個函數或者方法或者類在執行以前或者執行後作某些操做,也能夠理解爲,爲某個函數或者方法或者類添加功能
好處:是不用改變原來的函數,就能夠給原來的函數添加功能
方法:
1,定義一個函數,裏面傳一個值用於接收被裝飾函數的名稱(叫作裝飾器函數)
2,在裝飾器函數裏定義一個函數(叫作裝飾器功能函數)來寫添加功能和執行被裝飾函數
3,在裝飾器功能函數return返回被裝飾函數給裝飾器功能函數,而且在裝飾器函數return返回裝飾器功能函數給裝飾器函數spa
4,在被裝飾函數上面寫上 @裝飾器函數名 就能夠調用執行裝飾器函數code
重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果blog
#!/usr/bin/env python # -*- coding:utf-8 -*- #裝飾器函數 def zh(sh): #接收被裝飾函數的名稱 def zhshi(): #裝飾器功能函數 print("在執行被裝飾函數前添加功能") r = sh() # 執行裝飾器函數接收到的被裝飾函數,也就是執行被裝飾函數 print("在執行被裝飾函數後添加功能") return r #將被裝飾函數執行的結果返回給裝飾器功能函數 return zhshi #將裝飾器功能函數名稱返回給裝飾器函數 @zh # @zh 的意思是執行裝飾器函數,而且將被裝飾的函數名,當作參數傳給裝飾器函數,而且將裝飾器函數的返回值從新賦值給被裝飾的函數 #被裝飾函數 def f1(): print("f1被裝飾函數功能") #執行f1函數 f1() # 在執行被裝飾函數前添加功能 # f1被裝飾函數功能 # 在執行被裝飾函數後添加功能
重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果utf-8
裝飾器裝飾含兩個參數的函數,就是原始的函數有兩個形式參數class
#!/usr/bin/env python # -*- coding:utf-8 -*- #裝飾器函數 def zh(sh): #定義裝飾器函數,接收被裝飾函數的名稱 def zhshi(a1,a2): #定義裝飾器功能函數,接收被裝飾函數的形式參數,注意這裏的形式參數能夠不給被裝飾函數的形式參數同樣,但個數要同樣 print("在執行被裝飾函數前添加功能") r = sh(a1,a2) #接收被裝飾函數的形式參數而且執行被裝飾函數 print("在執行被裝飾函數後添加功能") return r #將被裝飾函數返回結果給,裝飾器功能函數 return zhshi #將裝飾器功能函數名稱返回給,裝飾器函數 @zh #調用執行裝飾器 #被裝飾函數 def f1(a1,a2): a3 = a1 + a2 return a3 #執行f1函數 s1 = f1(3,5) print(s1) # 最後打印結果 # 在執行被裝飾函數前添加功能 # 在執行被裝飾函數後添加功能 # 8
重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果coding
裝飾器裝飾含N個參數和任意參數的函數(推薦)方法
用(動態參數)一個*元組類型非約束參數名稱 *args 和(動態參數)兩個**字典類型非約束參數名稱 **kwargs ,來實現裝飾器裝飾任意參數的函數(詳情見自定義函數動態參數)im
動態參數)一個*元組類型*args:能夠接受多個單一性的實際參數
動態參數)兩個**字典類型非約束參數名稱**kwargs:能夠接受多個鍵值性參數
以上結合就能夠接受任意參數
#!/usr/bin/env python # -*- coding:utf-8 -*- #裝飾器函數 def zh(sh): #定義裝飾器函數,接收被裝飾函數的名稱 def zhshi(*args,**kwargs): #定義裝飾器功能函數,用*args,**kwargs動態參數,接收被裝飾函數的形式參數 print("在執行被裝飾函數前添加功能") r = sh(*args,**kwargs) #用*args,**kwargs動態參數,接收被裝飾函數的形式參數而且執行被裝飾函數 print("在執行被裝飾函數後添加功能") return r #將被裝飾函數返回結果給,裝飾器功能函數 return zhshi #將裝飾器功能函數名稱返回給,裝飾器函數 @zh #調用執行裝飾器 #被裝飾函數 def f1(a1,a2,a3): a4 = a1 + a2 print(a4) return a3 #執行f1函數 s1 = f1(3,5,"林貴秀") print(s1) # 在執行被裝飾函數前添加功能 # 8 # 在執行被裝飾函數後添加功能 # 林貴秀