python (七)裝飾器
阿新 • • 發佈:2018-12-12
每次 16px %s size 線上 都得 執行 可能 print
一、裝飾器的形成
需求1: 用一段代碼測試一下函數的執行效率
import time print(time.time()) # 輸出當前時間 def func1(): time.sleep(1) # 等待1秒 print(111) def func2(): time.sleep(1) print(222) start_time = time.time() # 開始時間 func1() # 執行此函數 end_time = time.time() # 結束時間 print(‘此函數的執行時間是%s‘ % (end_time-start_time)) #裝飾器--簡單版輸出執行時間 =結束時間-開始時間 start_time = time.time() func2() end_time = time.time() print(‘此函數的執行時間是%s‘ % (end_time-start_time))
但是如果有多個函數,都想測試他們的執行時間,是不是每次都得func1 = timer(func1)?
這樣還是有點麻煩,因為這些函數的函數名可能是不相同,有func1,func2,graph,等等
第一版本不好,重復造輪子,測試函數的效率 必須得復制代碼測試。
改版:使用函數
# 將代碼封裝到函數中,基本完成 import time裝飾器--使用函數def func1(): time.sleep(1) print(111) def func2(): time.sleep(1) print(222) def timmer(f): start_time = time.time() f() end_time = time.time() print(‘此函數的執行時間是%s‘ % (end_time-start_time)) timmer(func1) timmer(func2)
需求2: 生產環境測試函數的真正的執行效率:線上500個函數
線上問題:
線上的函數你不改變
函數的原本的調用方式不能改變
原本線上的調用方式:
func1
func2
但是用了測試效率的函數之後
def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print(‘此函數的執行時間是%s‘ % (end_time-start_time))
此時已經改變了函數的調用方式:
func1()
timmer(func1)
沒有改變函數裏面的函數體,但是改變了函數的調用方法,所以要解決:用最少的代碼,解決調用方式一致性的問題。
最終完成的需求 func1() 這個指令既要執行func1函數,又要測試效率
# 利用閉包,在不改變函數體的情況下 import time def func1(): time.sleep(1) print(111) def func2(): time.sleep(1) print(222) def timmer(f): # f = func1 函數的內存地址 def inner(): start_time = time.time() f() end_time = time.time() print(‘此函數的執行時間是%s‘ % (end_time-start_time)) return inner func1 = timmer(func1) # = inner func1() # inner() def func1(): print(func1) func1 = 777 print(func1)裝飾器--利用閉包
python (七)裝飾器