阜宁做网站工作室,2022年卡一卡二卡三精品,京东网站开发技术,京东seo是什么意思想再说一下装饰器的使用和原理。
之前已经说了装饰器的概念#xff0c;和语法#xff0c;这里想再进一步说一下几个装饰器的例子。
例子一#xff1a;
def makBlod(fn):def wrappen():return b fn() /breturn wrappendef makI…想再说一下装饰器的使用和原理。
之前已经说了装饰器的概念和语法这里想再进一步说一下几个装饰器的例子。
例子一
def makBlod(fn):def wrappen():return b fn() /breturn wrappendef makItalic(fn):def wrappen():return i fn() /ireturn wrappenmakBlod
def test1():return hello world - 01makItalic
def test2():return hello world - 02makBlod
makItalic
def test3():return hello world - 03print(test1())
print(test2())
print(test3())
首先看到上面的例子的时候函数 test1和test2的执行结果一看就了然于心那么test3函数的执行结果真的是要好好想想解释器的原理了。先看结果。
bhello world - 01/b
ihello world - 02/i
bihello world - 03/i/b
那么装饰器的原理到底是怎么样呢比如 test3 这个函数被两个装饰器makBlod和makItalic 同时装饰了。那么在具体说明原理之前先说一下装饰器在装饰的时候是从下向上装饰的看下面代码和执行结果。
def makBlod(fn):print(makBlod)def wrappen():return b fn() /breturn wrappendef makItalic(fn):print(makItalic)def wrappen():return i fn() /ireturn wrappenmakBlod
makItalic
def test3():return hello world - 03print(test3())makItalic
makBlod
bihello 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 出来的结果就构成了 bihello world - 03/i/b 这样的结果。