当我们想对一个已有的对象添加额外的功能时,可以使用如下方法:
- 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)。
- 使用组合
- 使用继承
与继承相比,通常应该优先选择组合,因为继承使得代码更难复用,继承关系是静态的,并且应用于整个类以及这个类的所有实例。
设计模式为我们提供了第四种可选的方法,以支持动态的扩展一个对象的功能,这种方法就是装饰器。
装饰器有很多用途,比如数据校验,事务处理,缓存,日志等。
这里以装饰器实现斐波那契数列缓存为例:
import functools
def memoize(fn):
known = {}
@functools.wraps(fn)
def decorator(args):
if args not in known:
known[args] = fn(args)
return known[args]
return decorator
@memoize
def fibonacci(n):
'''返回斐波那契数列的第n个数'''
assert (n >= 0), 'n must be >= 0'
return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)