python之路(四)-装饰器

python学习之路(四)-装饰器

装饰器的原理

装饰器是python为了在不改变函数中的代码的基础上,在其前面或者后面插入一些代码

例如:

def 函数名1(参数1):
    def 函数名2():
        ...
        r=参数1()    #执行原函数xxx的代码
        ...
    return 函数名2

@函数名1 #使用装饰器
def xxx():
    pass
    return 0

 

从上面的代码可以看出装饰器就是是一个函数1里面又嵌套了一个函数2,在里面的函数2中调用基础函数xxx,而使用装饰器只需要在基础函数的上面加“@函数名”即可。

原理剖析

  1. 当运行到“@outer“的时候,python解释器就会运行outer函数,同时将它下面的f1作为参数传递给func
  2. 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

posted @ 2018-02-17 22:15  菜鸟也有高飞的时候  阅读(157)  评论(0编辑  收藏  举报