python 裝飾器 深入理解python裝飾器

2021-08-28 15:26:26 字數 3353 閱讀 1823

要想徹底搞懂python中的裝飾器,除了需要有一點python中的函式基礎,還需要解決如下四個問題。當我們解決了這四個問題後,也就徹底搞懂python中的裝飾器。

1.什麼是裝飾器,其本質是什麼?

2.裝飾器有什麼作用?

3.裝飾器有什麼使用特點(使用原則)?

4.裝飾器的應用場景下面我們依次來回答。

第一部分:什麼是裝飾器,其本質是什麼?

裝飾器是什麼?

第二部分:.裝飾器有什麼作用?

來個例子理解一下:

# encoding: utf-8

import datetime

# 定義乙個列印日誌的裝飾器

def my_log(func):

print("print_log")

result = func(*args, **kwargs)

print("{}函式呼叫時刻:{}".format(func.__name__, datetime.datetime.now()))

return result

# 計算平方

@my_log

def cal_square(x):

result = x*x

print("{} * {} = {}".format(x,x, result))

return result

if __name__ == '__main__':

x=2result=cal_square(x)

print result

自定義了乙個計算乙個數平方的函式cal_square,要求呼叫這個函式時列印其呼叫日誌,就可以寫乙個日誌裝飾器,假設命名為my_log函式,用來裝飾所要呼叫的函式。

執行結果:

d:\python27\python.exe f:/pycharmprojects/tom/裝飾器的作用.py

print_log

2 * 2 = 4

cal_square函式呼叫時刻:2018-10-01 21:55:06.638000

4process finished with exit code 0

說明:

1.在定義裝飾器時,入參傳入了乙個函式,所以裝飾器是乙個高階函式,也返回了乙個內層函式名。

4.為了保證原函式的呼叫入參不受任何影響,內層函式入參:*args, **kwargs。

5.為了保證原函式的返回值不受任何影響,我們用乙個臨時變數result接收,並在內層函式進行返回了result。

6.你還記得前面提到的裝飾器的本質嗎?

其本質上就是個函式。可以用乙個等式理解:裝飾器 = 高階函式 + 巢狀函式。

第三部分:裝飾器有什麼使用特點(使用原則)?

這三點使用特點非常重要,歸結為:原來的函式之前怎麼呼叫、怎麼入參、什麼樣的返回值,使用裝飾器裝飾後這些都不受任何影響。也就是:我們在不對原來函式的源**、呼叫形式、返回值等任何修改的情況下,增強了原來函式的功能。

4.裝飾器的應用場景

應用場景非常多,開發中常見的如:

1.插入日誌

2.效能測試

3.處理事務

4.開發python開源框架時,非常常用

5、連線重試

下面再來個裝飾器,在工作中應該用得著,我們知道,程式跑起來後,有一些因素往往是不可控的,比如網路的連通性。斷了怎麼樣,得重試是吧,下面我們定義乙個重試機制的裝飾器,可以使用在專案中。

# 定義乙個列印方法耗時的裝飾器

def my_time(func):

start = time.time()

print("print_time")

result = func(*args, **keywords)

end = time.time()

t = end - start

print("{}方法執行耗時:秒".format(func.__name__, t))

return result

# 定義乙個重試機制的裝飾器

def retry(times=10):

def outer(f):

def inner(*args, **kwargs):

for i in xrange(times):

try:

return f(*args, **kwargs)

except exception as e:

if (i + 1) < times:

pass

else:

raise e

return inner

return outer

使用一下

import random

@retry(10)

def non_steady():

if random.random() <= 0.5:

# 失敗的概率是 0.5

raise exception("died")

else:

# 成功的概率是 0.5

return "survived"

kk=non_steady()

print kk

、d:\python27\python.exe f:/pycharmprojects/tom/裝飾器的作用.py

survived

process finished with exit code

# 計算平方

@my_time

@my_log

def cal_square(x):

time.sleep(3)

result = x*x

print("{} * {} = {}".format(x,x, result))

return result

cal_square(5)

d:\python27\python.exe f:/pycharmprojects/tom/裝飾器的作用.py

print_time

print_log

5 * 5 = 25

cal_square函式呼叫時刻:2018-10-01 22:19:01.435000

process finished with exit code 0

最後總之使用python裝飾器,可以讓你的**更易維護,可讀性也有一定提公升。

深入理解Python裝飾器

主要內容 l local 函式內部作用域 e enclosing 函式內部與內嵌函式之間 g global 全域性作用域 b build in 內建作用域 closure 內部函式中對enclosing作用域的變數進行引用 函式的實質與屬性 函式是乙個物件 函式執行完成後內部變數 函式屬性 函式返回...

python函式式程式設計3 裝飾器的深入理解

2 學習裝飾器必要的知識 5 使用裝飾器 上面第四點中2和3步驟在python中直接使用 語法糖來處理 timer defbar time.sleep 2 print 主函式 if name main bar 複製 import time deftimer func def args,kwargs ...

python深入 Python的深入理解

處理檔案和目錄 python 3 帶有乙個模組叫做 os,代表 作業系統 operating system os 模組 包含非常多的函式用於獲取 和修改 本地目錄 檔案程序 環境變數等的資訊。python 盡最大的努力在所有支援的作業系統上提供乙個統一的api,這樣你就可以在保證程式能夠在任何的計算...