在不修改函数的调用方式,但是还想在原来的函数前后添加功能。
最初版本的装饰器函数:执行顺序 1-2-6-14(wrapper(function))-12-14(赋给func,此时fun和inner指向同一个地址)-15-7-8-9-2-3-4-10-11

我们可以将上面的代码简化为:语法糖利用

但是该func()的一个大问题是没有返回值,执行func()本质上是执行inner(),inner并没有返回值,所以我们必须在innner里面加一个返回值,可以继续修改为

但是该func函数并没有参数,如果我们需要添加参数,修改为

以上函数精炼出一个装饰器初步模板:

注:加入要传入的参数是1,2,3,4。def inner()的作用是聚合--1,2,3,4==》(1,2,3,4),而f()的作用是打散,讲元组(1,2,3,4)转换成1,2,3,4。
原则:开放封闭原则
开放:对扩展是开放的
修改:对修改是封闭的
###正常情况下,我们使用装饰器对一个函数进行装饰,会导致该函数变名字,例如

知识点:
func.__name__:打印函数名
func.__doc__:打印注释文件
该例题中,会导致func修改成inner,为了解决这个问题,可以使用functools模块中的wraps。

浙公网安备 33010602011771号