• 第六天:结构型模式--修饰器模式


    零、修饰器模式

    当我们相对一个对象添加新功能的时候,无非就是下面这三种方法:

    • 直接修改对象所属类
    • 使用组合
    • 使用继承
      这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况我们才会使用继承。但是继承会导致代码难以服用,因为继承的关系是静态的,而且应用于整个类以及类的实例。这里我们引入修饰器模式作为第四种方法,修饰器模式优于组合和继承。
    • 什么是修饰器模式
      是对Python语法的动态改变,用于扩展一个类、方法或者函数的行为,动态的扩展一个对象的功能,以透明的方式动态的将功能添加到一个对象中。实现角度来说,修饰器就是一个可调用的对象,接受一个函数对象作为输入,并返回另一个函数对象。

    一、身边的例子

    • 枪支
      通过对枪支增加枪托、瞄准镜、消音器等外设增加枪支的威力和精准度。这里的枪托、瞄准镜和消音器就是修饰器

    • Django
      Django大量使用了修饰器,其中经典的是试图修饰器

    二、什么情况下使用

    • 扩展一个对象,但又不能影响对象内容的情况下

    三、应用案例

    import functools
    
    
    def memoize(fn):
        known = dict()
    
        @functools.wraps(fn)
        def memoizer(*args):
            if args not in known:
                known[args] = fn(*args)
            return known[args]
    
        return memoizer
    
    
    @memoize
    def nsum(n):
        '''
        返回前N个数字的和
        :param n:
        :return:
        '''
        assert (n >= 0), 'n must be >=0'
        return 0 if n == 0 else n + nsum(n - 1)
    
    
    @memoize
    def fibonacci(n):
        '''
        返回斐波那契额数列的第N个数
        :param n:
        :return:
        '''
        assert (n >= 0), 'n must be >=0'
        return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)
    
    
    if __name__ == '__main__':
        from timeit import Timer
    
        measure = [
            {'exec': 'fibonacci(100)', 'import': 'fibonacci', 'func': fibonacci},
            {'exec': 'nsum(100)', 'import': 'nsum', 'func': nsum}
        ]
        for m in measure:
            t = Timer('{}'.format(m['exec']), 'from __main__ import {}'.format(m['import']))
            print(
                'name:{},doc:{},executing:{},time:{}'.format(m['func'].__name__, m['func'].__doc__, m['exec'], t.timeit()))
    
  • 相关阅读:
    Selenium WebDriver 中鼠标事件(全)
    日常知识积累加不定期更新(一)
    动作手游实时PVP技术揭密(服务器篇)
    Java RMI之HelloWorld篇
    java中注解的使用与实例 (二)
    RPC原理及RPC实例分析
    动作手游实时PVP帧同步方案(客户端)
    java中注解的使用与实例(一)
    动作手游实时PVP技术揭密(服务器篇)
    AS3.0 几何结构 Point对象和Rectangle对象
  • 原文地址:https://www.cnblogs.com/gangzhucoll/p/12778251.html
Copyright © 2020-2023  润新知