python全栈学习笔记(十一)装饰器
装饰器
我们执行装饰器是执行里面的内层函数:

装饰器也是可以参数的,原函数里有多少参数, 新 指向的函数也有多少参数。
在不改变原来函数执行结果的基础上,我们再添加供能。

这种方式的传参,可以在不确定原函数有多少参数的情况下使用,*arg收集的是序列返回的是tuple,而**kwargs收集的是dict。
但是在新函数调用的时候如果像下面这个 ret = func(a1,a2) ,这样需要使用if语句来判断参数。
在python里可以写成


原函数有几个参数,调用的时候就需要写多少个,因为在调用装饰器的时候,需要用到参数的地方,装饰器会找原函数要。

一个函数可以应用多个装饰器
执行顺序是,先执行第一个装饰器,再执行第二个,最后执行原函数

多层装饰器的原理:
通过下面的例子,讲解下当一个函数执行多个装饰器的情况:
1、开始我们可以理解成执行一个装饰器(也就是outer),这时index就是outer里的func,而返回值inner就是新的index,而outer实际上也是个函数,我们把outer和index看成一个整体,这样outer的返回值(也就是inner),
作为参数传入第二个装饰器outer_0,这样outer的返回值就是outer_0里的func 。
2、现在我们正向理解:
1、先执行outer_0装饰器,然后里面的参数func就是装饰器outer的inner,结果就是其return的值,然后outer装饰器里面的func就是原函数index。就是这么个执行顺序。
#!/usr/bin/env python # -*- coding:utf-8 -*- def outer_0(func): def inner(*args,**kwargs): print('3.5') ret = func(*args,**kwargs) print(ret) return ret return inner def outer(func): def inner(*args,**kwargs): print('123') ret = func(*args,**kwargs) print('456') return ret return inner @outer_0 @outer def index(a1,a2): print('非常复杂') return a1 + a2 index(10,100)
执行结果:
3.5
123
非常复杂
456
110
单层装饰器的原理。


浙公网安备 33010602011771号