装饰器
参考
装饰器的作用就是在原函数代码不做任何修改的情况下增加新的功能
在理解装饰器之前,我们需要先理解 变量是可以指向函数的,同时函数也是变量。
这里我们使用绝对值函数作为示例,我们把abs函数赋值给变量f,f也就有了abs函数的功能。
再理解下函数可以作为返回值,什么是闭包
|
|
再写一个示例
|
|
简单装饰器
进入正文,装饰器(decorator)
函数是可以指向变量的,变量f也是函数now,调用函数f()
这里我们需要不变动now函数代码的同时动态地增加打印日志的功能,
|
|
把@log放到now函数上等于执行了now = log(now)
|
|
带参数的装饰器
这里有三层嵌套,最里面内嵌函数wrapper引用了外部函数log和decorator的参数,decorator函数返回值为wrapper函数, log函数的返回值为decorator函数
|
|
这相当于执行了now = log(‘here’)(now)
|
|
函数也是对象,它有name属性,经过装饰器装饰的函数,它们的name已经从原来的now变成了wrapper
|
|
这里需要把原始函数的name复制到wrapper函数中,不然依赖函数签名的代码运行会出错
functools.wraps()就可有解决这个问题
|
|
对于带参数的装饰器同样是如此实现