如果有aop的程式設計經驗,理解python的裝飾器就是分分鐘的事。既然是裝飾器,那麼對被裝飾的物件來說,一定是功能得到了增強,按方法能增強的地方進行劃分,又可以分為以下四類:
1. 方法呼叫前;
2. 方法呼叫後;
3. 方法呼叫前後(環繞);
4. 方法呼叫異常;
def
add(a, b):
return a + b
def
before
(func):
# 只能通過引數宣告的方式獲取引數
defcheck
(a, *args):
# 如果小於0,丟擲異常
if(a < 0):
raise exception('a is less than zero!')
else:
return func(a, *args)
# 記住,返回的一定是函式
return check
@before
defadd
(a, b):
return a + b
# 自動會丟擲錯誤
print add(-1, 2)
# 攜帶引數的寫法
defafter
(num):
# 注意巢狀層次
defafterproxy
(func):
# 修改返回結果
defaddmore
(*args):
# 對結果進行包裝
result = func(* args) + num
return result
return addmore
return afterproxy
# 等同於after(5)(before(add(a, b)))
# 可以不同時使用,裝飾之間沒有依賴關係
@after(5)
@before
defadd
(a, b):
return a + b
# 返回結果為8
print add(1, 2)
# 定義環繞裝飾
defround
(func):
defroundproxy
(*args):
print
'before execute'
print func(*args)
print
'end execute'
return roundproxy
# 執行呼叫
add(1, 2)
# 輸出結果為
# before execute
# 8# end execute
# 定義異常裝飾器
# ex為異常型別
defmathexcept
(ex):
defexceptproxy
(func):
defdivfunc
(*args):
try:
return func(*args)
# 捕獲異常
except ex:
# 處理業務邏輯
return
0return divfunc
return exceptproxy
# 新增異常裝飾器
@mathexcept(zerodivisionerror)
defdiv
(a, b):
if(b == 0):
raise zerodivisionerror('b is zero')
else:
return a / b
# 呼叫結果
print div(3, 0)
@after(5)
@before
@round
defadd
(a, b):
return a + b
# 引入wraps
from functools import wraps
defbefore
(func):
@wraps(func)
defcheck
(a, *args):
# 如果小於0,丟擲異常
if(a < 0):
raise exception('a is less than zero!')
else:
return func(a, *args)
# 記住,返回的一定是函式
return check
@before
defadd
(a, b):
return a + b
# 現在可以獲取函式的元資料資訊
print add.__name__
print add.__doc__
在攜帶引數時,請記得再務必包裝一層;
裝飾器注重呼叫的順序,所以在裝飾器的設計中,最好有詳細的設計規範。
結合aop的切入點理解裝飾器會更容易。
python裝飾器 AOP的語法糖
python裝飾器是乙個很出名的設計模式,它主要的功能就是不改變函式已有功能的情況下對函式起到乙個錦上添花的作業,使函式的功能更加豐富,在插入日誌,效能測試,快取機制和許可權驗證都是比較好的左右。不同的函式可以使用同乙個裝飾器,所以它和函式本身不存在什麼必然的聯絡。def timeit func d...
面向切面程式設計 AOP 和裝飾器??
主要功能 日誌記錄,效能統計,安全控制,事務處理,異常處理等等。主要意圖 將日誌記錄,效能統計,安全控制,事務處理,異常處理等 從業務邏輯 中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的 裝飾器是乙個很著名的設計模式,經常被用...
使用Python 裝飾器,踐行AOP設計理念
def decorator func args可以保證使用裝飾器的函式需要的引數 乙個或多個 被正確傳遞 kw表示接收任意數量的關鍵字引數,它將以字典的形式被傳入 print 這是裝飾器附加的語句 func args,kw print 這是目標函式結束後被執行的語句 decorator def ca...