結構型模式 裝飾器模式

2021-09-24 23:06:41 字數 2050 閱讀 7665

為已有的物件新增新的功能

新增新的方法到物件所屬的類中

使用組合創造新的物件

使用繼承創造子類

組合 > 繼承 > 新增新方法

python中我們可以使用內建的裝飾器特性來實現對類,方法的擴充套件,而無需使用繼承。

用裝飾器來實現程式中的橫切關注點(應用中通用的部件,可以在程式中被廣泛使用的)

推薦使用functools.wraps來建立裝飾器

# 裝飾器的輸入是乙個函式

defmemorizer

(fn)

:# 閉包

know =

dict()

# 記錄函式執行的狀態

@functools.wraps(fn)

# args 為傳入函式的引數

deffunc

(*args)

:if args not

in know:

know[args]

= fn(

*args)

return know[args]

# 裝飾器的返回值是乙個函式

return func

還需要更多的關於裝飾器的練習來強化對於裝飾器的理解。

利用裝飾器來裝飾類,拓展類的行為

# 類裝飾器的輸入是乙個類定義

deflog_decorator

(cls):

origin_func = cls.func_name

# 定義新函式來包裝舊函式

@functools.wraps(origin_func)

defnew_func

(self,

*args)

:print

("decorator"

)return origin_func(self,

*args)

cls.func_name = new_func

return cls

@log_decorator

class

log:

def__init__

(self)

:print

("initialization"

)def

func_name

(self,

*args)

:#這個是需要裝飾的函式

print

("inner function"

)

對於類的裝飾,一般是指對於類方法的裝飾

如何關閉裝飾器執行

多裝飾器執行順序

從外到內執行,最後執行被裝飾的函式,但這僅僅是閉包函式(新封裝的函式)的執行順序。如果裝飾器中,在閉包函式之前有**,執行順序將會不同。

在閉包函式之前的**,是從內到外執行,也就是先執行內層修飾器的內容,再執行外層修飾器的內容。

原因: 執行順序是先執行內層的修飾器,返回函式,再執行外層修飾器來包裝之前的返回函式。這樣修飾器的執行順序是從內到外。而由於外層修飾器是後被包裝在函式上的,因此在執行閉包函式時,先執行外層的閉包函式再執行內層的閉包函式

裝飾器傳參問題

有的時候需要裝飾器為函式準備一些位置引數,而不是由使用者輸入。因此在呼叫的時候,使用者只輸入乙個位置引數。

def

decorator_a

(func)

:def

inner_func

(*args,

**kwargs)

:# 為函式準備引數

kwargs =

func(

*args,

**kwargs}

return inner_func

@decorator_a

deffunc_f

(x, params)

:# 引數x由使用者輸入

# 引數params由裝飾器準備

print

(x)print

(params)

func_f(

1)

裝飾模式(結構型模式)

裝飾模式是一種動態的給類中新增新行為的設計模式,裝飾模式比生成子類更為靈活,可以給某個物件而不是整個類新增一些功能。值得注意的是裝飾模式的裝飾類也繼承介面類,同時他也有介面類的指標指向他需要裝飾的具體類。外表看著像is a的關係,實際也是has a的關係。實際應用中裝飾類可以同時裝飾幾個具體類。可以...

結構型模式 裝飾模式

裝飾模式是對類的組合進行的擴充。比如現在有個門,現在有一些額外功能,比如 新增鎖 貼春聯 門眼 門框全包 等功能,這些功能可以單獨存在,也可以兩兩組合等隨意組合。怎麼實現這樣的 門 呢.繼承 比如有 貼春聯 門眼 就新增乙個新類,這樣如果需要其他的功能就需要無窮多的子類。組合 加強版組合 裝飾模式 ...

結構型模式(三) 裝飾器模式

允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。我們通過下面的例項來演示裝飾器模式的用法。其中,我們將把乙個形狀裝飾上不同的顏色,同時又...