第二十九節,裝飾器

裝飾器簡介python

裝飾器,用於裝飾某個函數,或者方法,或者類
裝飾能夠用於某個函數或者方法或者類在執行以前或者執行後作某些操做,也能夠理解爲,爲某個函數或者方法或者類添加功能
好處:是不用改變原來的函數,就能夠給原來的函數添加功能
方法:
1,定義一個函數,裏面傳一個值用於接收被裝飾函數的名稱(叫作裝飾器函數)
2,在裝飾器函數裏定義一個函數(叫作裝飾器功能函數)來寫添加功能和執行被裝飾函數
3,在裝飾器功能函數return返回被裝飾函數給裝飾器功能函數,而且在裝飾器函數return返回裝飾器功能函數給裝飾器函數函數

4,在被裝飾函數上面寫上 @裝飾器函數名 就能夠調用執行裝飾器函數spa

重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果3d

#!/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被裝飾函數功能
# 在執行被裝飾函數後添加功能

重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果code

 

裝飾器裝飾含兩個參數的函數,就是原始的函數有兩個形式參數blog

#!/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

重點:只要函數應用上了裝飾器,那麼函數就會被從新定義,從新定義爲裝飾器的內層函數,裝飾器內層函數的返回結果就等於應用了裝飾器的函數結果內存

 

 

裝飾器裝飾含N個參數和任意參數的函數(推薦)utf-8

 

用(動態參數)一個*元組類型非約束參數名稱 *args 和(動態參數)兩個**字典類型非約束參數名稱 **kwargs ,來實現裝飾器裝飾任意參數的函數(詳情見自定義函數動態參數)字符串

 

動態參數)一個*元組類型*args:能夠接受多個單一性的實際參數
動態參數)兩個**字典類型非約束參數名稱**kwargs:能夠接受多個鍵值性參數
以上結合就能夠接受任意參數class

#!/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
# 在執行被裝飾函數後添加功能
# 林貴秀

 

 

裝飾器之多個裝飾器裝飾同一個函數(重點)

裝飾器之多個裝飾器裝飾同一個函數,是從被裝飾函數最近的一個裝飾器調用開始的,依次從下到上的將裝飾器內層函數賦值疊加給上一個裝飾器,等到達最上層調用裝飾器時在一步一步向疊加的函數裏面解析,將最後結果返回給最上層調用裝飾器在返回給被裝飾函數

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#裝飾器之多個裝飾器裝飾同一個函數,注意註釋說明的步驟
#裝飾器函數1
def zh(sh): #第一步將zh裝飾器函數放入內存,第五步執行zh裝飾器函數
    def zhshi(*args,**kwargs):
        print("在執行被裝飾函數前添加功能")  #打印字符串
        r =  sh(*args,**kwargs)     #注意此時的sh函數就是zh2裝飾器函數的內層函數zhshi2,也就是執行的zhshi2()函數
        print("在執行被裝飾函數後添加功能")  #打印字符串
        return r    #返回zhshi2函數的返回值
    return zhshi
#裝飾器函數2
def zh2(sh):    #第二步將zh2裝飾器函數放入內存,第四步將zh2裝飾器函數名和它的參數傳入zh裝飾器函數
    def zhshi2(*args,**kwargs):
        print("額外增長")
        r =  sh(*args,**kwargs)
        return r
    return zhshi2
@zh
@zh2    #第三步執行zh2裝飾器函數而且把f1函數名和它的參數傳入zh2裝飾器函數
def f1(a1,a2,a3):
    a4 = a1 + a2
    print(a4)
    return a3

#執行f1函數
s1 = f1(3,5,"林貴秀")
print(s1)
#打印出
# 在執行被裝飾函數前添加功能
# 額外增長
# 8
# 在執行被裝飾函數後添加功能
# 林貴秀

相關文章
相關標籤/搜索