一般帶引數裝飾器。
使用裝飾器時需要加上括號@logged()。
@logged將會提示引數錯誤。
import logging
logging.basicconfig(level=logging.debug)
deflogged
(level=logging.info):
defdecorator
(func):
def(*args, **kwargs):
log = logging.getlogger(func.__module__)
log.log(level, ('execute %s!' % func.__name__))
return func(*args, **kwargs)
return decorator
@logged()
defadd
(x, y):
return x + y
add(1, 1)
利用functools.partial定義可選引數裝飾器。
此時若無參,@logged()和@logged都是可以的。
from functools import partial
defnew_logged
(func=none, *, level=logging.info):
ifnot func:
return partial(new_logged, level=level)
def(*args, **kwargs):
log = logging.getlogger(func.__module__)
log.log(level, ('execute %s!' % func.__name__))
return func(*args, **kwargs)
@new_logged
defminus
(x, y):
return x - y
@new_logged(level=logging.warning)
defplus
(x, y):
return x + y
對於@new_logged,因為@new_logged後沒有(),這時候被裝飾函式minus會被作為第乙個引數直接傳入new_logged裝飾器,即new_logged(minus)。
@new_logged
defminus
(x, y):
return x - y
相當於:
def
minus
(x, y):
return x - y
minus = new_logged(minus)
對於@new_logged(),因為@new_logged存在(),這是傳入的引數為空,將會執行判斷語句返回partial(new_logged, level=level)。
@new_logged()
defminus
(x, y):
return x - y
相當於:
def
minus
(x, y):
return x - y
minus = new_logged()(minus)
對於@new_logged(level=logging.warning):即在@new_logged()的基礎上傳入了引數,第乙個func依舊為none,執行判斷語句返回partial(new_logged, level=level)。
@new_logged(level=logging.warning)
defplus
(x, y):
return x + y
相當於:
def
plus
(x, y):
return x + y
plus = new_logged(level=logging.warning)(plus)
裝飾器模式 decorator
所有的說明和解釋都在 中有注釋來標明 package mode.decorator 這裡定義乙個介面,在介面中定義我們要執行的操作。以後所有的裝飾器以及我們要裝飾的物件都要實現這個介面。有了這樣的大前提,我們就可以其用 sourcable來定義我們的裝飾器和要裝飾的物件了 public inte c...
裝飾器模式 Decorator
設計原則 1 類應該對擴充套件開發,對修改關閉。特點 1 裝飾物件和真實物件有相同的介面。這樣客戶端物件就可以以和真實物件相同的方式和裝飾物件互動。2 裝飾物件包含乙個真實物件的引用 reference 3 裝飾物件接收所有來自客戶端的請求,它把這些請求 給真實的物件。4 裝飾物件可以在 這些請求之...
裝飾器模式(Decorator)
裝飾器模式的作用 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾器模式比生成子類更加靈活。裝飾器模式結構圖 各個類或介面的職能 component是定義乙個物件介面,可以給這些物件增加功能。concretecomponent定義乙個具體的物件。decorator是裝飾抽象類,為物件增加功能...