python设计模式之装饰器模式

python设计模式之装饰器模式

意图

  • 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活

适用性

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
  • 处理那些可以撤消的职责
  • 当不能采用生成子类的方法进行扩充时
    1. 可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
    2. 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类

例子

# -*- coding=utf-8 -*-


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()

# output:
Decorator func1
Foo func1
foo_decorator
Foo func2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值