程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python深入淺出的裝飾器1

編輯:Python

前言

這裡是清安,本章一起深入淺出一下裝飾器。前面我們講過一章裝飾器了。不知道各位看懂了多少。每太看懂也沒關系,本章就一起實操一下。

簡單的例子

例1

def outer(fun):
print("1....")
def inner():
print("2.....")
fun()
return inner
@outer
def count():
print("3....")
if __name__ == '__main__':
print("4....")
count()

例2

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看看怎麼運行的,再結合理解一下。


例子1,時間戳-函數執行時間

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.


例子2,日志信息

import logging
def logger(fun):
def inner(*args,**kwargs):
logging.basicConfig(format='[
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved