裝飾器
裝飾器就是先封裝一個功能函數,像鋼鐵俠的衣服一樣,需要的時候直接套上,就可以使用它的功能了。當然這個衣服是隨時可以根據改進的。
運用場景: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、 裝飾器傳參