详解Python的装饰器

装饰器:

当我们写了一个很长的函数后,发现还需要添加一些功能,这时需要从开始来读已经写好的代码,在更改时需要大量的时间,在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

在原有基础上添加一个外部变量,在原有的装饰器外再添加一个函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值