裝飾器
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的執行個體來示範裝飾器模式的用法。其中,我們将把一個形狀裝飾上不同的顔色,同時又不改變形狀類。
我們知道在python中裝飾器的外部函數隻運作一次,探究之下,緣由如下
def deco(func):
print("裝飾外部函數")
def inner():
print("before")
func()
return "内部函數"
print("外部函數")
return inner
@deco
def myfunc():
print("myfunc")
#myfunc = deco(myfunc)
myfunc()
myfunc()
myfunc()
裝飾器是一個嵌套的函數,外部函數把内部函數作為傳回值傳回。
裝飾器文法 “@deco”相當于語句“myfunc = deco(myfunc)”
外部函數deco(myfunc)把傳回值内部函數 inner 指派給被裝飾的函數 myfunc
是以外部函數隻在調用裝飾器的時候運作一次,之後被裝飾的函數功能等同于裝飾器的内部函數,而外部函數不再次執行。
上述代碼塊執行結果如下:
裝飾外部函數
外部函數
before
myfunc
before
myfunc
before
myfunc