简单的装饰器代码(给装饰的函数有参数和返回值):
#!_*_ 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"装饰后"。此时运行结果。
时间: 2024-09-30 09:02:50