Decorator
在以前的 Blog 中曾经简单写过 Decorator。这次需要讲的更细一些。
Decorator 通过返回包装对象实现间接调用,以此插入额外逻辑。是从老大那边偷来的哪里摘抄来的,应该算是言简意赅了。
1234 | @dec2@dec1def func(arg1, arg2, ...): pass |
可以还原成
123 | def func(arg1, arg2, ...): passfunc = dec2(dec1(func)) |
123 | @decomaker(argA, argB, ...)def func(arg1, arg2, ...): pass |
可以还原成
1 | func = decomaker(argA, argB, ...)(func) |
12345678910111213141516171819 | 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]: fooOut[3]: <function __main__.inner> In [4]: foo() before funcOut[4]: 2 |
这个过程中执行了下面几步
装饰器不仅可以用函数返回包装对象,也可以是个类,不过这种方法太尼玛啰嗦,这里就不介绍了,想了解的自己去翻吧。下面我们写一个有点用处的 Decorator。 假想我们有个coordinate类,而且这个类提供了 x, y坐标,而我们要对两个coordinate 对象进行计算。代码如下:
123456789101112131415161718192021222324252627 | 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 对象进行计算。代码如下:
|
下一篇:一行 Python 代码