python入门——装饰器

  • A+
所属分类:编程语言

装饰器:

当我们写了一个很长的函数后,发现还需要添加一些功能,这时需要从开始来读已经写好的代码,在更改时需要大量的时间,在python中可以实用装饰器来给一个函数加上一个方法,比如我们有一个打印一段话"hello"的函数,我们需要在加上"world"

python入门——装饰器

printHello函数内部不做任修改,在addWorld使用闭包,在addFun调用了printHello函数,并添加了返回值

在调用时world=addWorld(printHello) 把printHello函数传入addWorld,返回的结果为addFun函数,world指向addFun函数,

Print world() #调用addFun ,返回printHello的返回值在加上world

但是在上边的例子中,我们在使用修改过后的函数时,需要一个world接收addWorld的返回值,把world指向addFun,再调用world(),这个过程就比较复杂了,我们可以使用下边的方式

python入门——装饰器

只需要在需要修改的函数前加上一个@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入门——装饰器

当python解释器执行到@addHaha时,会将下一行的函数,进行装饰,但是下一行为@addWorld,所以解释器需要把@addworld先进行装饰,在装饰完成后,运行结果就是,先把addworld运行完成的返回值作为参数传递到addHaha中,注意理解这两个装饰器的运行和装饰过程,

python入门——装饰器

带参数的装饰器

上图的装饰器,返回两个数的和的两倍

带参数的装饰器的通用模式

def fun(funName):

def fun1(*args,**kwargs):

ret=funName(*args,**kwargs)

return ret

return fun1

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

python入门——装饰器

addNum1(5)装饰后可以看做@addNum ,

weinxin
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: