舉例講解python裝飾器的使用
阿新 • • 發佈:2020-10-16
需求:領導想知道,該測試用例執行,用例的執行時間是多少,我們怎麼實現該程式碼?
如下:想要實現下面用例的執行時間是多少,怎麼做?
def creat_oder(): """這個是原始碼,一條測試用例""" print("執行測試用例") time.sleep(1)
你可能會想到,記錄開始時間,結束時間,然後計算差就行了唄,好,那我們來看看
#第一種方法在函式內去修改
import time def creat_oder(): start_time=time.time() #開始時間 print("執行測試用例") #假設它是需要執行的測試用例time.sleep(1) #為了增加顯示效果 end_time=time.time() #結束時間 print("用例的執行時間是:",end_time-start_time) creat_oder()
分析:這樣做真的可以嗎,看起來好像是沒有錯,但是已經修改了原來的程式碼結構,要是有其他同事也呼叫這個函式,是不是看見程式碼被改了,想錘你。那怎麼辦?
你可能會想到,那我寫個重新寫個函式,然後呼叫這個creat_oder函式不就行了吧。好,那我們繼續看。
#第二種方法、把函式當作引數傳遞給另一個函式
import time def creat_oder():print("執行測試用例") time.sleep(1) def show_time(func): start_time=time.time() func() end_time=time.time() print("用例的執行時間是:",end_time-start_time) show_time(creat_oder)
#分析:以上的方法邏輯沒有問題,也可以實現。但是修改了函式名字.因為我們每次都需要將函式creat_oder作為一個引數傳遞給show_time函式 、之前的執行邏輯是直接執行creat_oder函式,但是現在不得不執行show_time(creat_oder)。 假設有10個方法呼叫需要creat_oder函式去統計執行時間,那是不是得修改10處地方,很麻煩怎麼辦?
#第三種方法,裝飾器的使用(繞了這麼久就是為了講這個)
#定義裝飾器 def show_time(func): #func引數 def inner(): #將需要對creat_oder增加的程式碼寫到這裡面 start_time=time.time() func() end_time=time.time() print("用例的執行時間是:", end_time - start_time) return inner #使用裝飾器 @show_time #語法糖@ 等價於 creat_oder=show_time(creat_oder) def creat_oder(): print("執行測試用例") time.sleep(1) creat_oder()
分析:就是將需要增加的程式碼寫在inner裡面,然後給它定義一個裝飾器名字,使用的時候在原來程式碼上加上@語法糖和裝飾器名稱,就到達了裝飾目的。
看完以上程式碼,你應該明白了,裝飾器就是對我們原有的程式碼進行增強,修飾的作用,就好像裝修房子一樣,不對房子的結構做改變,但是需要貼桌布,置辦傢俱讓房子變得更好看更舒適。
那再補充一點,這個時候,老闆又提出了要求,說需要知道這個用例的執行人是誰??怎麼做?
第四種方法、帶引數的函式裝飾器(強化)
import time def who_body_run(name): def show_time(func): def inner(): start_time=time.time() func() end_time=time.time() print("用例的執行時間是:", end_time - start_time) print("執行者是:",name) return inner return show_time @who_body_run('tom') def creat_oder(): print("執行測試用例") time.sleep(1) creat_oder() #等價於who_body_run('tom')(creat_oder)()
分析:發現只需要在方法三中的程式碼外包裹一層函式,就可以實現裝飾器的引數化。至此,老闆有要求你也不用擔心做不了了。。