1、装饰器的设计思想是什么?
装饰器的设计是基于软件设计的“开放封闭原则”,即:对软件功能拓展开放,对代码修改封闭,简而言之就是在不修改原有代码的基础上增加功能。
2、python装饰器的本质是什么?
python中装饰器的本质就是被引用函数地址发生了改变(这里只讨论函数的装饰器)。在python中函数也是对象。
3、函数作为参数参数传递的区别
先看一个例子
在这里将foo作为传输传给了函数func1(),实际传递的是函数foo这个对象在内存中的地址,也就是foo整个函数体;如果写成func1(foo()),则是将函数foo()执行的结果作为参数传给func1()。
回到上面的例子。上面例子就是一个简单的装饰器,装饰器可以分为装饰过程和执行过程。
在装饰过程中发生了什么呢?
(1)先将foo函数体传递给func1(),进入func1()函数之后,先执行print语句,读到函数inner_func()直接跳过,返回函数体inner_func给f1。结果就是f1-->inner_func。
在执行过程中发生了什么呢?
(1)先进入到inner_func函数(),执行输出语句,再执行函数func(),这里函数保存的就是foo()函数地址,这里会先执行foo()中的内容,再返回。
如果将上述装饰过程用一个符号来表示,就变成了真正意义上的装饰器!
使用@语法糖,就可以完成装饰过程,当再次调用被装饰函数时,就完成执行过程。
4、一句话总结装饰器的运行机制就是:被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。
5、多个装饰器装饰一个函数
(1)多个装饰器遵循的规则是:装饰过程自下而上;执行过程自上而下。
(2)举个例子
上图的例子实际的运行过程是什么?
装饰过程
(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、装饰器支持传参。