Python基礎 _ 裝飾器

裝飾器

    裝飾器就是先封裝一個功能函數,像鋼鐵俠的衣服一樣,需要的時候直接套上,就可以使用它的功能了。當然這個衣服是隨時可以根據改進的。 

    運用場景:1. 引⼊⽇志

                     2. 函數執⾏時間統計

                     3. 執⾏函數前預備處理
                      4. 執⾏函數後清理功能
                      5. 權限校驗等場景

                      6. 緩存等等等等等

    基礎版實現代碼:

import time

# 封裝計時函數,放一個參數,來傳入外部函數
'''鋼鐵俠的皮'''
def time_spend(func):
    ''' 定義取到外部函數時執行的操作:
        1、調用time函數,分別設開始時間,結束時間
        2、調用外部函數,放在倆時間點中間
        3、打印耗時
        4、返回響應執行操作的函數
    '''
    def call_func(*args,**kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print('耗時: %.5f' % (end_time-start_time))
    return call_func

'''鋼鐵俠本俠'''
@time_spend
def num():
    for i in range(1000):
        print('小可愛')
# 調用函數
num()

運行結果:
...
小可愛
小可愛
耗時: 0.04397
這就是一個簡單的計時函數的運用。此時被裝飾的函數是無參函數。(這裏的裝飾器和被裝飾的函數都是
無參的)

可以理解爲,計時函數好比是衣服 , 有需要的人只要在頭頂加一個@路由 指引衣櫃的位置,直接去穿這身兒衣服就行。


 升級版實現代碼:

        1 、 被裝飾函數傳參

我們都用上面的代碼,好對比

import time

'''鋼鐵俠的皮'''
def time_spend(func):
    # 2  爲了防止被裝飾函數傳入不定長的參數,還得重複修改,
    #  乾脆一開始就使用形參:*args,**kwargs,隨便傳
    def call_func(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        end_time = time.time()
        print('耗時: %.12f' % (end_time-start_time))
    return call_func

'''鋼鐵俠本俠'''
@time_spend
# 1 帶參的被裝飾函數
def num(a,b):
    for i in range(b):
        print(a+i)

# 3 調用函數並傳參
num(1000,100)
運行結果:
...
1098
1099
耗時: 0.00099

三個小改動, num變成了帶參函數~~~

1  帶參的被裝飾函數

2  裝飾器中:爲了防止被裝飾函數傳入不定長的參數,還得重複修改, 乾脆一開始就使用形參:*args,**kwargs, 隨便傳什麼參數

3  由於函數帶參數, 調用時,我們輸倆數字做測試

小小小小總結: 帶參的函數~  就是在調用的時候,需要傳參(emm不用裝飾器調用時也得傳,這裏是廢話沒錯),需要注意的是在接收參數的地方設置形參,後續裝飾器用起來就不用重複修改了 。 裝飾器內調用函數func(*args,**kwargs)當然也需要形參了

    2、 裝飾器傳參


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章