要想徹底搞懂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,這樣你就可以在保證程式能夠在任何的計算...