- A+
装饰器:
当我们写了一个很长的函数后,发现还需要添加一些功能,这时需要从开始来读已经写好的代码,在更改时需要大量的时间,在python中可以实用装饰器来给一个函数加上一个方法,比如我们有一个打印一段话"hello"的函数,我们需要在加上"world"
printHello函数内部不做任修改,在addWorld使用闭包,在addFun调用了printHello函数,并添加了返回值
在调用时world=addWorld(printHello) 把printHello函数传入addWorld,返回的结果为addFun函数,world指向addFun函数,
Print world() #调用addFun ,返回printHello的返回值在加上world
但是在上边的例子中,我们在使用修改过后的函数时,需要一个world接收addWorld的返回值,把world指向addFun,再调用world(),这个过程就比较复杂了,我们可以使用下边的方式
只需要在需要修改的函数前加上一个@addWorld,我们的调用方式就和原来的方式一样,
在@addWorld时会执行以下过程
执行addWorld函数 ,并将 @addWorld 下面的函数作为addWorld函数的参数,即:@addWorld等价于 addWorld(printHello) 所以,内部就会去执行:
def addFun():
return func()+"world" #func为参数 等于printHello
return addFun#返回 addFun,是函数
addWorld的返回值
将执行完的addWorld函数返回值 赋值 给@addWorld下面的函数的函数名printHello即将addWorld的返回值再重新赋值给 printHello,即:
新的printHello=def addFun():
return 原来的printHello()+"world"
这样printHello的指向就变了,而原来的函数内部没有进行任何修改
如果一个函数有两个装饰器的情况,那么执行过程是怎样的
当python解释器执行到@addHaha时,会将下一行的函数,进行装饰,但是下一行为@addWorld,所以解释器需要把@addworld先进行装饰,在装饰完成后,运行结果就是,先把addworld运行完成的返回值作为参数传递到addHaha中,注意理解这两个装饰器的运行和装饰过程,
带参数的装饰器
上图的装饰器,返回两个数的和的两倍
带参数的装饰器的通用模式
def fun(funName):
def fun1(*args,**kwargs):
ret=funName(*args,**kwargs)
return ret
return fun1
在原有基础上添加一个外部变量,在原有的装饰器外再添加一个函数,
addNum1(5)装饰后可以看做@addNum ,