python装饰器,其实就是对闭包的使用。

装饰器

理解装饰器要先理解闭包(在闭包中引用函数,可参考上一篇通过例子来理解闭包)。

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

装饰器的实质就是对闭包的使用,原函数被当作参数,处理完的返回值又赋给原函数。

  1. 装饰器用来装饰函数;
  2. 返回一个函数对象;
  3. 被装饰函数标识符指向返回的函数对象;
  4. 语法糖 @dec

通过一个例子体会,和前边的在闭包中引用函数进行对比。很像。

Def dec(func):

         Print(’call dec’)

         Def in_dec(*arg): 

                   Print (‘in dec arg=’, arg)

                   If len(arg) == 0:

                            Return 0

                  For val in arg:

                            If not isinstance(val,int):

                                     Return 0

                   Return func(*arg)

         Return in_dec

@dec

Def my_sum(*arg):  #my_sum = in_dec

         Print (‘in my_sum’)

         Return sum(arg)

Print (my_sum(1,2,3,4,5))

结果:

Call dec

n dec arg=(1,2,3,4,5)

in my sum

15

执行过程:首先由于@dec,代码会调用函数dec,而且这个函数的参数就是原函数my_sum。装饰器会返回新的函数对象in_dec,同时My_sum被当作了enclosing内部变量被in_dec使用。然后会被my_sum接收,被装饰的函数指向新的函数。my_sum = in_dec,然后内部调用了最原来的my_sum函数。

原文地址:https://www.cnblogs.com/christychang/p/6550752.html