Python 装饰器自理解备忘

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 装饰器自理解备忘相关的知识,希望对你有一定的参考价值。

简单的装饰器代码(给装饰的函数有参数和返回值):

#!_*_ coding=utf-8 _*_
#!/usr/bin/env python

def outer(fun):
    def wrapper(var):
        print "装饰前"
        resulf = fun(var)
        print "装饰后"
        return resulf
    return wrapper

@outer
def Func1(var):
    print "this is Func1",var
    return "this is Func1 return"

resulf = Func1("wlw")
print resulf

执行结果:
#这是Func1经过装饰后的结果
装饰前
this is Func1 wlw
装饰后
#这是接受的函数的返回值
this is Func1 return



理解的执行流程:

1、执行def outer,此时创建outer函数并存放到内存中。

2、执行@outer,此时python会去执行第一步创建的outer函数。outer函数是需要给一个参数的,@outer会把@outer后定义的Func1该函数(创建Func1并存放到内存中)当做变量传递给outer函数。

3、开始执行outer函数,执行def wrapper,此时创建wrapper函数并存放到内存中,然后执行后续流程,return wrapper。

4、当return wrapper执行完毕后,装饰器会把返回的wrapper函数赋值给@outer后面定义的函数Func1,即Func1 = wapper。此时装饰器执行完毕。

5、当执行Func1("wlw"),因为上面装饰器已经把wrapper赋值给Func1了,此时调用Func1("wlw")相当于调用wrapper("wlw")。

6、调用wrapper后,开始执行wrapper函数,把参数"wlw"传递给wrapper函数,然后执行print "装饰前"。然后往下走调用了fun("wlw")函数,fun是在调用装饰器的时候由outer函数将Func1将参数传递进来的。即此时fun("wlw")等于Func1("wlw"),那么此时开始执行Func1("wlw"),print "this is Func1",然后执行完函数后把"this is Func1 return"当做返回值返回,即resulf="this is Func1 return"。然后把resulf当做wrapper的返回结果返回。后print"装饰后"。此时运行结果。



以上是关于Python 装饰器自理解备忘的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

测试 python 备忘录装饰器

C#常用代码片段备忘

常用python日期日志获取内容循环的代码片段

python基础总结

VSCode自定义代码片段6——CSS选择器