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