Python裝飾器(3)多裝飾器裝飾

內(nèi)容純屬個(gè)人理解,不對(duì)之處,歡迎指正。

多裝飾器示例

def deco1(func):
    '''i am deco1'''

    print('---deco1---')

    def wrapper1(*args, **kwargs):
        '''i am wrapper1'''

        print('---wrapper1:before func---')
        func(*args, **kwargs)
        print('---wrapper1:after func---')
    return wrapper1


def deco2(func):
    '''i am deco2'''

    print('---deco2---')

    def wrapper2(*args, **kwargs):
        '''i am wrapper2'''

        print('---wrapper2:before func---')
        func(*args, **kwargs)
        print('---wrapper2:after func---')
    return wrapper2


@deco1
@deco2
def foo():
    '''i am foo'''
    print('---foo---')


if __name__ == '__main__':
    print('---start---')
    foo()

運(yùn)行結(jié)果:

---deco2---
---deco1---
---start---
---wrapper1:before func---
---wrapper2:before func---
---foo---
---wrapper2:after func---
---wrapper1:after func---

通過(guò)現(xiàn)象看本質(zhì)。我們注意到,程序開(kāi)始執(zhí)行后,裝飾函數(shù)是最先開(kāi)始執(zhí)行的,然后再執(zhí)行的foo。原因就是Python解釋器在執(zhí)行到foo定義處時(shí),檢測(cè)到有兩個(gè)裝飾器,所以立即執(zhí)行其中的裝飾代碼對(duì)函數(shù)進(jìn)行裝飾,此時(shí)foo函數(shù)便具有了額外的功能。
接下來(lái)在執(zhí)行foo時(shí)可以看到:多裝飾器的裝飾順序是由內(nèi)到外,而執(zhí)行順序是由外到內(nèi)

多裝飾過(guò)程拆分

fn2 = deco2(foo)  # ---deco2---
fn1 = deco1(fn2)  # ---deco1---
foo = fn1 
print(foo)  # <function deco1.<locals>.wrapper1 at 0x7f18baf4e620>

foo函數(shù)作為參數(shù)傳遞到deco2,deco2執(zhí)行;然后將結(jié)果作為參數(shù)傳遞到deco1,deco1執(zhí)行;然后將結(jié)果賦值給foo,此時(shí)的foo即為裝飾后的函數(shù)wrapper1,如果想保留原函數(shù)相關(guān)信息,可以使用functools中的wraps函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,553評(píng)論 19 139
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個(gè)常見(jiàn)概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,907評(píng)論 0 27
  • 占位符
    呵呵噠1991閱讀 467評(píng)論 0 0
  • 我站著窗邊仰望星空,愛(ài)好天文的我盯著每一顆劃破夜空的星星,久久不愿離去。 看的正激動(dòng)時(shí),只見(jiàn)一顆星...
    Y萬(wàn)事如意Y閱讀 551評(píng)論 0 0
  • 蕎麥酒是我們經(jīng)常喝的一種糧食酒,是用蕎麥釀造成的酒,市場(chǎng)上需求量非常大,雖然很多人飲酒是處于身體的需求而去飲酒,但...
    酒的時(shí)光機(jī)閱讀 363評(píng)論 0 0

友情鏈接更多精彩內(nèi)容