Decorator
在以前的 Blog 中曾经简单写过 Decorator。这次需要讲的更细一些。
Decorator 通过返回包装对象实现间接调用,以此插入额外逻辑。是从老大那边偷来的哪里摘抄来的,应该算是言简意赅了。
1 2 3 4 |
@dec2 @dec1 def func(arg1, arg2, ...): pass |
可以还原成
1 2 3 |
def func(arg1, arg2, ...): pass func = dec2(dec1(func)) |
1 2 3 |
@decomaker(argA, argB, ...) def func(arg1, arg2, ...): pass |
可以还原成
1 |
func = decomaker(argA, argB, ...)(func) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
In [1]: def outer(func): ...: def inner(): ...: print "before func" ...: ret = func() ...: return ret + 1 ...: return inner #返回 inner 函数对象 ...: In [2]: @outer # 解释器执⾏行 foo = outer(foo) ...: def foo(): ...: return 1 ...: In [3]: foo Out[3]: <function __main__.inner> In [4]: foo() before func Out[4]: 2 |
这个过程中执行了下面几步
- 函数 foo 作为 装饰器 outer 的参数被传入
- 函数 inner 对 func 进行调用,然后装饰器 outer 返回 inner
- 原来的函数名 foo 关联到 inner,如上面的foo 所示,调用 foo 时间上是在调用 inner
装饰器不仅可以用函数返回包装对象,也可以是个类,不过这种方法太尼玛啰嗦,这里就不介绍了,想了解的自己去翻吧。下面我们写一个有点用处的 Decorator。 假想我们有个coordinate类,而且这个类提供了 x, y坐标,而我们要对两个coordinate 对象进行计算。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Coordinate(object): def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return "Coord: " + str(: return "Coord: " + str( id="crayon-58127f7cbc599786888919" class="crayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-always" style=" margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;">
可以还原成
可以还原成
这个过程中执行了下面几步
装饰器不仅可以用函数返回包装对象,也可以是个类,不过这种方法太尼玛啰嗦,这里就不介绍了,想了解的自己去翻吧。下面我们写一个有点用处的 Decorator。 假想我们有个coordinate类,而且这个类提供了 x, y坐标,而我们要对两个coordinate 对象进行计算。代码如下:
|