Python 装饰器之 functools.wraps

Decorator

在以前的 Blog 中曾经简单写过 Decorator。这次需要讲的更细一些。

Decorator 通过返回包装对象实现间接调用,以此插入额外逻辑。是从老大那边偷来的哪里摘抄来的,应该算是言简意赅了。

可以还原成

可以还原成

这个过程中执行了下面几步

  1. 函数 foo 作为 装饰器 outer 的参数被传入
  2. 函数 inner 对 func 进行调用,然后装饰器 outer 返回 inner
  3. 原来的函数名 foo 关联到 inner,如上面的foo 所示,调用 foo 时间上是在调用 inner

装饰器不仅可以用函数返回包装对象,也可以是个类,不过这种方法太尼玛啰嗦,这里就不介绍了,想了解的自己去翻吧。下面我们写一个有点用处的 Decorator。 假想我们有个coordinate类,而且这个类提供了 x, y坐标,而我们要对两个coordinate 对象进行计算。代码如下:

上面例子中的sub(one, two)three都有负数,当我们把坐标限制在第一象限时,这两个就不符合我们的要求,用 Decorator 来做一个检测再好不过了

这样,只计算的函数addsub前面加一个 Decorator 就可以完成坐标的校验。比在函数内实现要优雅一些。

Decorator 还可以为类增加额外的成员,

functools.wraps

我们在使用 Decorator 的过程中,难免会损失一些原本的功能信息。直接拿 stackoverflow 里面的栗子

而functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module____name____doc__,或者通过参数选择。代码如下:

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部