python设计模式之装饰器模式
意图
- 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活
适用性
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤消的职责
- 当不能采用生成子类的方法进行扩充时
- 可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
- 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类
例子
class Foo(object):
def __init__(self):
self.name = 'foo'
def show_func1(self):
print("Foo func1")
def show_func2(self):
print("Foo func2")
class FooDecorator(object):
def __init__(self, dec):
self._dec = dec
self.name = 'foo_decorator'
def show_func1(self):
print("Decorator func1")
self._dec.show_func1()
def __getattr__(self, name):
"""
装饰器类中,已经有的属性和方法,会使用decorator类中的。
如果没有,则会取Foo类的属性和方法
:param name:
:return:
"""
return getattr(self._dec, name)
if __name__ == '__main__':
foo = Foo()
foo_dec = FooDecorator(foo)
foo_dec.show_func1()
print foo_dec.name
foo_dec.show_func2()
Decorator func1
Foo func1
foo_decorator
Foo func2