python之路(四)-装饰器
python学习之路(四)-装饰器
装饰器的原理
装饰器是python为了在不改变函数中的代码的基础上,在其前面或者后面插入一些代码
例如:
def 函数名1(参数1): def 函数名2(): ... r=参数1() #执行原函数xxx的代码 ... return 函数名2 @函数名1 #使用装饰器 def xxx(): pass return 0
从上面的代码可以看出装饰器就是是一个函数1里面又嵌套了一个函数2,在里面的函数2中调用基础函数xxx,而使用装饰器只需要在基础函数的上面加“@函数名”即可。
原理剖析
- 当运行到“@outer“的时候,python解释器就会运行outer函数,同时将它下面的f1作为参数传递给func
- outer函数的返回值将赋值给f1,所以当在下面执行f1()的时候,执行的不是原本的f1函数了,而是执行outer函数里面的inner,因为outer的函数返回值为inner
装饰器装饰含有参数的函数
两个参数
动态参数
但需要动态传递参数的时候,就需要用到万能的参数列表了*args,**kwargs,就算我们动态的传递传数,python解释器也会正确的将我们的参数传递给原本的基础函数
多个装饰器装饰一个函数
以两个装饰器为例子,如图:
如果有多个装饰器的话,执行的顺序是从上往下执行的,但是我们从内往外看,如图:
装饰器outer1将f1传给了outer1的参数func(f1),在outer1中return了inner1,所以原本的f1函数变成了inner1函数,也就是如果只有一个装饰器的话,执行f1()也就是执行了inner1(),现在有两个装饰器,那么我们可以将里面的那个装饰器看成一个整体(就是inner1函数),inner1作为参数传给了outer2的func(inner1),执行inner1()函数的话也就是执行inner2()函数,所以执行的顺序inner2-->inner2中的func函数(也就是inner1函数)-->inner1中的func函数(也就是f1()函数)-->f1