裝飾器是困擾我好久的問題,最近忽然開竅,理解了裝飾器的含義 執行過程以及原理app
裝飾器:(本質是函數,裝飾其餘函數,幫其餘函數實現附加的功能)ide
器:表明函數函數
裝飾:表明裝飾這個函數性能
原則:內存
不能修改裝飾的函數內部源代碼ci
不能修改原來函數的調用方式開發
裝飾器公式: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()
這是個很簡單的裝飾器用法,下面我一步一步解釋
@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.打印函數結束時間
能夠看到執行過程,未改變函數內部的代碼邏輯,未改變表面看到的函數執行方法