day 11 - 1 裝飾器
阿新 • • 發佈:2018-12-04
裝飾器
裝飾器形成的過程 : 最簡單的裝飾器——有返回值的——有一個引數——萬能引數
裝飾器的作用:不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能
原則 :開放封閉原則
語法糖 :@裝飾器函式名
裝飾器的固定模式
原則:開放封閉原則
開放:對擴充套件是開放的
封閉:對修改是封閉的
首先我們來逐步實現這麼一個功能吧
計算程式碼執行的時間
#先來看下需要的元件 import time #time 模組 time.time() #獲取當前時間 time.sleep(5) #讓程式睡眠多少時間 print(time.time()) #來試下
我們來寫一個可以計算時間的函式
def func(): start=time.time() time.sleep(0.1) #時間太短 系統會顯示 0.0,所以我們讓他休眠 0.1s print("計算程式執行的時間") end=time.time() print(end-start) func()
但是這裡有一個問題:如果要計算很多函式的執行時間,那不是要在函式中都加上幾行計算的程式碼,這顯然是不可行的,一般寫好的沒問題的函式,是不會去對它進行修改,而且還很麻煩
所以這裡我們寫一個計算時間的函式獨立出來
def times(f): start=time.time() time.sleep(0.1) f() end=time.time() print(end-start) def func(): print("計算程式執行的時間") def func2(): print(time.sleep(5)) times(func) times(func2)
但是這樣貌似還有一個問題,我要計算時間的函式只能一個一個的執行,或者寫 n 個 time() 來呼叫
接著我們來了解下裝飾器吧,解決這樣的問題
先來寫一個簡單的裝飾器
#待完善
裝飾器的固定模式
def wrapper(f): #裝飾器函式,f是被裝飾的函式 def inner(*args,**kwargs): #定義一個內建函式,且和下面統級別的返回值名字一致且不加括號 #動態引數一定要原封不動的傳給 被裝飾的函式 f() '''在被裝飾函式之前要做的事''' ret = f(*args,**kwargs) #被裝飾的函式 函式執行完的返回值要原封不動傳給 return '''在被裝飾函式之後要做的事''' return ret return inner @wrapper #語法糖 @裝飾器函式名 等價於 func = wrapper(func) def func(a,b): #被裝飾的函式 time.sleep(0.01) print('你好:世界',a,b) return '新年好' #print(func(23,45)) #接收返回值 ret = func(23,45) #接收返回值 print(ret)