Python 装饰器

18 阅读1分钟

装饰器

什么是函数装饰器: 函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为

  • 装饰器本质上是一个 ”可调用的对象“
  • 装饰器的参数 func 其实是 ”被装饰的函数“
  • 装饰器 可能会处理 被装饰的函数,然后把它返回
  • 装饰器 可能会处理 被装饰其的函数,将其替换成另一个函数 或 可调用对象

325abfc96a40bb379278d928b132021.jpg

为什么在装饰器中可能用到nonlocal 关键字

第一:这源于一个 python 假定

Python 不要求声明变量,但是假定在 函数定义体 中赋值的变量是局部变量

第二:当在装饰器函数 定义体中,对不可变类型赋值,如果想让变量 在离开内部函数体后,也可以继续使用,就需要将 变量声明为 nonlocal

ef9f5b7cd16d3fa8b48d581c64c8d6c.jpg

functools.wraps 装饰器

由于前述说到,装饰器 可能会处理 被装饰的函数,将其替换成另一个函数 或 可调用对象。

所以,在经过装饰器 装饰后,被装饰的函数的 namedoc 属性就被覆盖了。

为了保留被装饰的函数的属性,在内部函数上,使用 @functools.wraps(func) 属性

参数化装饰器

如果想给装饰器本身传参,就在原有装饰器的基础再包一层装饰,将参数传递给最外层装饰器函数