装饰器
什么是函数装饰器: 函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为
- 装饰器本质上是一个 ”可调用的对象“
- 装饰器的参数
func其实是 ”被装饰的函数“ - 装饰器 可能会处理 被装饰的函数,然后把它返回
- 装饰器 可能会处理 被装饰其的函数,将其替换成另一个函数 或 可调用对象
为什么在装饰器中可能用到nonlocal 关键字
第一:这源于一个 python 假定
Python 不要求声明变量,但是假定在 函数定义体 中赋值的变量是局部变量
第二:当在装饰器函数 定义体中,对不可变类型赋值,如果想让变量 在离开内部函数体后,也可以继续使用,就需要将 变量声明为 nonlocal
functools.wraps 装饰器
由于前述说到,装饰器 可能会处理 被装饰的函数,将其替换成另一个函数 或 可调用对象。
所以,在经过装饰器 装饰后,被装饰的函数的 name 和 doc 属性就被覆盖了。
为了保留被装饰的函数的属性,在内部函数上,使用 @functools.wraps(func) 属性
参数化装饰器
如果想给装饰器本身传参,就在原有装饰器的基础再包一层装饰,将参数传递给最外层装饰器函数