Python装饰器(二)
想再說一下裝飾器的使用和原理。
之前已經(jīng)說了裝飾器的概念,和語法,這里想再進一步說一下幾個裝飾器的例子。
例子一:
def makBlod(fn):def wrappen():return "<b>" + fn() + "</b>"return wrappendef makItalic(fn):def wrappen():return "<i>" + fn() + "</i>"return wrappen@makBlod def test1():return "hello world - 01"@makItalic def test2():return "hello world - 02"@makBlod @makItalic def test3():return "hello world - 03"print(test1()) print(test2()) print(test3())首先看到上面的例子的時候,函數(shù) test1和test2的執(zhí)行結(jié)果一看就了然于心,那么test3函數(shù)的執(zhí)行結(jié)果真的是要好好想想解釋器的原理了。先看結(jié)果。
<b>hello world - 01</b> <i>hello world - 02</i> <b><i>hello world - 03</i></b>那么裝飾器的原理到底是怎么樣呢!比如 test3 這個函數(shù)被兩個裝飾器@makBlod和@makItalic 同時裝飾了。那么在具體說明原理之前先說一下裝飾器在裝飾的時候是從下向上裝飾的,看下面代碼和執(zhí)行結(jié)果。
def makBlod(fn):print("makBlod")def wrappen():return "<b>" + fn() + "</b>"return wrappendef makItalic(fn):print("makItalic")def wrappen():return "<i>" + fn() + "</i>"return wrappen@makBlod @makItalic def test3():return "hello world - 03"print(test3()) makItalic makBlod <b><i>hello world - 03</i></b>在裝飾器里面加了各加了一行代碼,從代碼的執(zhí)行的結(jié)果可以看出,makItalic裝飾器先執(zhí)行了,然后才是上面makBlod裝飾器執(zhí)行。由此可得出,裝飾器在裝飾的時候是從下向上裝飾的(也就是先@makItelic然后才是@makBlod?)。
第一步:裝飾 @makItali,看粉色的線段,這個時候全局下的變量test3指向了makItalic 函數(shù)里面函數(shù) wrappen 的位置,也就是說此時,全局下的函數(shù)test3在執(zhí)行的時候是執(zhí)行 makItalic 里面的 wrappen函數(shù),wrappen的test3函數(shù)就指向原來test3函數(shù)的指引位置。
第二部:裝飾 @makBlod,看綠色的線段。因為第一步里面test3函數(shù)是 makItalic 里面的wrappen,所以在裝飾的時候,穿進去局部變量函數(shù)test3應(yīng)該是 makItalic 里面的wrappen(看綠色曲線所指引的位置),在makBlod函數(shù)裝飾完成后,全部變量test3所指引的位置應(yīng)該是 makBlod函數(shù)里面的wrappen局部函數(shù)。
上面兩步裝飾器的裝飾工作完成,那么在調(diào)用的時候,test3() 。
1、makBlod函數(shù)里面的wrappen先執(zhí)行。
2、makItalic函數(shù)里面的wrappen載執(zhí)行。
3、最下面那個代碼塊再執(zhí)行(就是原來全局下test3所指引的位置)
這個執(zhí)行完后,return 出來的結(jié)果就構(gòu)成了?<b><i>hello world - 03</i></b> 這樣的結(jié)果。
?
總結(jié)
以上是生活随笔為你收集整理的Python装饰器(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vant+cell+picker+级联选
- 下一篇: websocket python爬虫_p