python的装饰器

 

1、装饰器的设计思想是什么?

     装饰器的设计是基于软件设计的“开放封闭原则”,即:对软件功能拓展开放,对代码修改封闭,简而言之就是在不修改原有代码的基础上增加功能。

2、python装饰器的本质是什么?

     python中装饰器的本质就是被引用函数地址发生了改变(这里只讨论函数的装饰器)。在python中函数也是对象。

3、函数作为参数参数传递的区别

   先看一个例子

python的装饰器

 

 

在这里将foo作为传输传给了函数func1(),实际传递的是函数foo这个对象在内存中的地址,也就是foo整个函数体;如果写成func1(foo()),则是将函数foo()执行的结果作为参数传给func1()。

回到上面的例子。上面例子就是一个简单的装饰器,装饰器可以分为装饰过程和执行过程。

python的装饰器

 

 在装饰过程中发生了什么呢?

(1)先将foo函数体传递给func1(),进入func1()函数之后,先执行print语句,读到函数inner_func()直接跳过,返回函数体inner_func给f1。结果就是f1-->inner_func。

在执行过程中发生了什么呢?

(1)先进入到inner_func函数(),执行输出语句,再执行函数func(),这里函数保存的就是foo()函数地址,这里会先执行foo()中的内容,再返回。

 

如果将上述装饰过程用一个符号来表示,就变成了真正意义上的装饰器!

python的装饰器

 

 使用@语法糖,就可以完成装饰过程,当再次调用被装饰函数时,就完成执行过程。

 

4、一句话总结装饰器的运行机制就是:被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。

 

5、多个装饰器装饰一个函数

(1)多个装饰器遵循的规则是:装饰过程自下而上;执行过程自上而下。

(2)举个例子

python的装饰器

 

 

上图的例子实际的运行过程是什么?

装饰过程

(1)装饰器@func1:输出“hello_1!”,foo() 指向inner_func(),func()指向foo()

(2)装饰器@func2:输出“hello_2!”,inner_func()指向inner_func2(),func()指向inner_func

执行过程

  执行@func2:即执行inner_func2(),输出“inner_b”,并执行func(),而此时func()指向的是inner_func()(即装饰器@func1的指向,相当于执行装饰器@func1)

  执行@func1:输出“inner_a”,再执行foo(),输出“out_foo”

 

6、装饰器支持传参。

 

python的装饰器

上一篇:spring cloud项目搭建


下一篇:诺基亚NuageNetworks软件定义网络(SDN)助力中国移动迈入公有云新时代