python裝飾器理解

import time
def timer(func):
def deco(*args, **kwargs):
stat_time = time.time()
func(*args, **kwargs)
print(func)
stop_time = time.time()
print('the func run time is{}'.format(stop_time - stat_time))
return deco
# @timer
def test1():
time.sleep(2)
print('in the test1')
test1 = timer(test1)
test1()
'''
裝飾器 :
要理解python裝飾器,首先需要分清一個點,
函數名和函數體
函數體只是放在記憶體空間中的數據(和其他數據沒有不同,都是電路開關狀態的集合)
函數名是指向函數體儲存空間的一個路標,而路標不止一個
當某個函數名改變時,這個函數名這個路標不再指向之前的函數體空間,而指向新的函數體空間
久的函數體空間不會發生變化,只是函數名的指向作用變化了
就算一個函數體空間沒有任何函數名路標指向他,他也不會立刻消失,
電腦會隔一段時間去處理,並非即時的。

如上程式碼所示,將test1這個路標以實參的方式傳給timer中的func
那麼,test1func是作用相同的,指向同一個函數體空間的路標
而這個函數體空間現在有兩個函數名路標指向他
timer的返回值,deco同樣也是一個指向另一個函數體空間的路標
在這個函數體空間中,有著func這個路標,這應該涉及到python的預編譯
或者是實參會直接通過形參傳給函數內部調用位置。
最後將返回出的deco函數名路標賦值給test1
test1不再和func一樣指向同一個函數體空間,
而是同deco一樣,指向另一個函數體空間
所以此時通過test1來找函數體空間,只能找到新的函數體空間
裝飾器就ok
@timer的作用相當於test1 = timer(test1)
是開發者做的糖
'''
Tags: