python裝飾器簡單理解
阿新 • • 發佈:2019-01-10
裝飾器定義:1、把一個函式名當作實參傳給另外一個函式(在不修改裝飾函式原始碼的情況下為其新增功能)
2、返回值中包含函式名(不改變函式呼叫方式)
原始碼:
1 def f(): 2 def f(): 3 time.sleep(2) 4 print('i am f') 5
加基本計算程式執行時間函式
1 def f(): 2 print('i am f') 3 time.sleep(2) 4 def my_time(): 5 s_time = time.time() 6 f()7 e_time = time.time() 8 print("消耗了%s秒"%(e_time - s_time)) 9 my_time()
1 #把func函式傳入 2 def f(): 3 print('i am f') 4 time.sleep(2) 5 def my_time(func): #傳入函式 6 s_time = time.time() 7 f() #列印函式 8 e_time = time.time() 9print("%s消耗了%s秒"%(func.__name__,e_time - s_time)) 10 my_time(f) #
但呼叫時需用my_time來呼叫,思路就是可以把my_time下的定義為一個函式,再把它返回
1 def f(): 2 print('i am f') 3 time.sleep(2) 4 def my_time(func): #傳入函式 my_timer(f) func = f 5 def wrapper(): 6 s_time = time.time() 7 f() #列印函式 8 e_time = time.time() 9 print("%s消耗了%s秒"%(func.__name__,e_time - s_time)) 10 return wrapper #返回這個函式的記憶體地址 11 n = my_time(f) #相當於執行my_time函式,該函式返回指向了wrapper,相當於執行了wrapper(),而wrapper就開始執行時間啊,列印這些 12 f = n 13 f()
理解上述的return wrapper:返回的是func的記憶體,即 f函式的記憶體地址
print(my_time(f)) 輸出的是wrapper的記憶體地址 表示return返回的地址
@my_time #等價於f = my_time(f)
加要求,多打一個log,且要在時間函式前