1. 程式人生 > >python (七)裝飾器

python (七)裝飾器

每次 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 (七)裝飾器