Decorator裝飾器定義可選引數

2021-07-30 04:05:28 字數 2095 閱讀 3233

一般帶引數裝飾器。

使用裝飾器時需要加上括號@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是裝飾抽象類,為物件增加功能...