天天看點

在python中,裝飾器外部函數為什麼隻運作一次

裝飾器

裝飾器模式(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