這裡是清安,本章一起深入淺出一下裝飾器。前面我們講過一章裝飾器了。不知道各位看懂了多少。每太看懂也沒關系,本章就一起實操一下。
def outer(fun):
print("1....")
def inner():
print("2.....")
fun()
return inner
@outer
def count():
print("3....")
if __name__ == '__main__':
print("4....")
count()
def outer(fun):
print("1....")
def inner():
print("2.....")
fun()
return inner
def count():
print("3....")
count = outer(count)
print("4....")
count()
上述的兩個例子,執行結果為:1423.為什麼呢???
語法糖:什麼是語法糖?
我們在count上有這麼一個@outer的函數名稱,那麼他實際的的意思是count = outer(count)。那麼在不用@outer的時候就跟例2一樣。用一個相同的變量名替換原來的,但是內存地址發生了改變。這樣來實現了一個調用的過程。有點偷梁換柱的意思。
1、看完上述,是否有那麼一點理解為什麼是1423了。首先會進入裝飾器所以會執行print(“1…”) ----------------------------------------
2、執行完了步驟一,那麼解析來就需要打印print(“4…”)了。為什麼?因為outer函數執行完了。----------------------------------------
3、那麼為什麼outer函數執行完了,不輸出print(‘2…’)?因為我們已經偷梁換柱了,return了inner,此時這裡的count()就是inner(),所以執行count()函數,實際上就是執行inner()所以會輸出print(‘2…’) ----------------------------------------
4、那麼這個print(‘3…’)為什麼最後才輸出,因為我們outer(count),count已經參數傳遞了,在裝飾器中,在inner的最後面我們調用了fun()。所以最後輸出print(‘3…’)
現在是否已經理解了呢。如果還不理解,那麼就打斷點debug看看怎麼運行的,再結合理解一下。
import time
def count_time(fun):
def inner():
st_time = time.time()
fun()
ed_time = time.time()
print(f"函數耗時{
ed_time-st_time}")
return stop
@count_time
def test01():
for i in range(5):
time.sleep(0.1)
print("正在執行 原函數")
if __name__ == '__main__':
test01()
只要前面的內容看懂了,此處函數執行時間的例子還是很容易看懂的。此處就是多增了一個time模塊。用來獲取當前時間的。所以,函數執行獲取一次當前時間,函數結束獲取一次當前時間,用結束的時間減去開始的時間,就是函數執行花費的時間。
為了突出函數執行花費的時間,這裡我也是調用了time中的sleep方法,再test01中進行了等待。每次循環完等待0.1S.
import logging
def logger(fun):
def inner(*args,**kwargs):
logging.basicConfig(format='[