python 裝飾器從放棄到玩轉(初級)

裝飾器是困擾我好久的問題,最近忽然開竅,理解了裝飾器的含義 執行過程以及原理app


裝飾器:(本質是函數,裝飾其餘函數,幫其餘函數實現附加的功能)ide

器:表明函數函數

裝飾:表明裝飾這個函數性能


原則:內存

  1. 不能修改裝飾的函數內部源代碼ci

  2. 不能修改原來函數的調用方式開發


裝飾器公式:it

高階函數+嵌套函數 == 裝飾器class

(這裏不對高階函數和嵌套函數作解釋,請先了解什麼叫作高階函數和嵌套函數)test


下面從一個簡單的程序讓你瞭解裝飾器的含義

假如我如今有這麼兩個別人寫的函數,咱們這在聯合開發,如今有個需求須要對這兩個函數進行性能的統計,也就是計算這兩個函數的運行時間,可是不容許你去修改對方的源代碼和調用方式,有人會說這很簡單,能夠在函數的調用先後添加時間的統計,再進行計算,這樣是能夠,若是咱們有100個函數須要進行統計呢,或者我今天想統計運行時間,明天我只想記錄函數的運行開始時間,難道我還得一個一個改嗎

def test1():

    time.sleep(3)

    print "test01"


def test2():

    time.sleep(3)

    print "test02"


test1()

test2()


下面介紹裝飾器,上面說到裝飾器的做用就是給現有函數添加附加功能,咱們這邊利用裝飾器添加函數運行時間統計

def record_time(func):
    def warpper():

        start_time = time.time()

        func()

        end_time = time.time()

        print "總共用時:" + str(int(end_time) - int(start_time))

    return warpper


@record_time

def test1():

    time.sleep(3)

    print "test01"


@record_time

def test2():

    time.sleep(3)

    print "test02"


test1()

test2()


這是個很簡單的裝飾器用法,下面我一步一步解釋

  1. @record_time: 表明的是 test1 = record_time(test1)

    這兩個test1表明的含義不一樣:

    前面的test1=warpper,由於record_time(test1)時,record_time裏面直接返回的wapper的內存地址

    後面的test1的含義是test1函數自己

  2.test1(),當咱們如今執行test1()是,實際執行的是warpper()

  3.執行warpper函數內部代碼邏輯

  4.打印函數開始時間

  5.func()表明的是test1(),由於record_time(test1) test1==func

  6.打印函數結束時間


能夠看到執行過程,未改變函數內部的代碼邏輯,未改變表面看到的函數執行方法

相關文章
相關標籤/搜索