首先修飾器是幹嗎用的呢,他是用來修飾函數的,在不改變原函數的調用方式的前提下,爲原函數擴充某些功能。這個例子是從教學視頻上學來的,感覺老師講的不錯,拿來與大家分享分享。
import time
def timer(func):
def deco():
start_time=time.time()
func()
stop_time = time.time()
print("The func time is %s"%(stop_time-start_time))
return deco
@timer # test1 = timer(test1)
def test1():
time.sleep(3)
print("in the test1")
test1()
這是個比較簡單的修飾器程序,該修飾器爲函數test1()擴充的功能是:爲test1()函數的運行計時。
程序的運行過程有點複雜,所以記錄下來一遍以後參考:
(1)程序開始:定義函數timer,注意對於Python定義函數可以理解爲開闢一塊內存來存放函數的程序,不去執行,甚至不執行檢查其中內容的操作,這是Python與C、C++不一樣的地方。
(2)執行@timer,這裏其實就是執行
test1 = timer(test1)
不知道編譯器是怎麼知道test1的地址的,不過這裏暫且這樣認爲:執行這一句是程序先把test1定義,即先爲test1開闢一塊內存空間,再執行timer(test1)。執行這一句即定義函數deco,爲其開闢內存空間來存儲代碼。最後返回deco的存儲地址,並把它賦值給test1。
執行完這一句後,實際上test1已經被偷樑換柱成了deco。
(3)執行test1(),即執行deco()。這樣便把擴展功能加了上去。