1. 程式人生 > >python裝飾器簡單理解

python裝飾器簡單理解

裝飾器定義: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()
 9
print("%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,且要在時間函式前