1. 程式人生 > 實用技巧 >舉例講解python裝飾器的使用

舉例講解python裝飾器的使用

需求:領導想知道,該測試用例執行,用例的執行時間是多少,我們怎麼實現該程式碼?

如下:想要實現下面用例的執行時間是多少,怎麼做?

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)()

分析:發現只需要在方法三中的程式碼外包裹一層函式,就可以實現裝飾器的引數化。至此,老闆有要求你也不用擔心做不了了。。