####零、修饰器模式
当我们相对一个对象添加新功能的时候,无非就是下面这三种方法:

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

####一、身边的例子

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

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

####二、什么情况下使用

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

####三、应用案例

import functoolsdef 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 Timermeasure = [{'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()))

第六天:结构型模式--修饰器模式相关推荐

  1. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  2. 结构型模式---修饰器模式

    修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法.1.如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)2.使用组合3.使用继承 与继承相比,通常应该优 ...

  3. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  4. python模式选择符,Python设计模式之修饰器模式

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如:添加一个新方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继承 ...

  5. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  6. python 修饰器 教程_python 实现 修饰器模式

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继 ...

  7. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  8. 修饰器模式(day04)

    修饰器设计模式 --最近我给女朋友买了一款可以更换外壳的手机.现在的外壳是红色的,假如我想用这款手机的时候,会更换成银灰色的外壳.但是我不能随意更换天线或者话筒,因为这些功能模块在手机生产的时候就已经 ...

  9. php装饰器模式 简书,装饰器模式/包装器模式

    在电视剧<相爱十年>中,主角肖然把出现了品控问题的安尔雅肥皂换了个包装.改了套说辞变成了全新的品牌浴雪清,并成功的推销出去了,得到了第一桶金.这就说所谓的包装,本质上并没有改变,但是外在表 ...

最新文章

  1. 余承东安卓鸿蒙,鸿蒙亮点多,网友嗨了!华为P50还没定,余承东:最强大操作系统...
  2. FCN全连接卷积网络(2)--读论文的过程理解
  3. CodeForces - 1454F Array Partition(线段树+二分)
  4. Scott Mitchell 的ASP.NET 2.0数据教程之三十九:: 在编辑和插入界面里添加验证控件...
  5. Arduino笔记-解决ESP8266上传代码时出现error: espcomm_upload_mem failed问题
  6. 快速上手Tomcat(eclipse中配置tomcat)
  7. jBPM与业务系统集成-通过定制Task Instance等方式实现
  8. Excel GET.DOCUMENT说明
  9. [转载]JSONP跨域的原理解析
  10. Android Studio 工程项目的结构
  11. Windows自带的几种截图快捷键使用方法记录
  12. 2017年苹果开发者账号申请——账号VISA卡支付流程
  13. Linux VPS 免费管理面板推荐
  14. 计算机数制转换操作方法,计算机数制转换新方法
  15. 表格自适应 css,css 表格自适应一些方法总结
  16. mysql创建新用户
  17. 谁是全球芯片行业的“麒麟才子”?得之可得天下!
  18. Kubernetes学习二:资源管理及入门实战
  19. 【3】天猫精灵开放实验平台实验— 切换意图,参数传递
  20. 微信十年,张小龙教给我们的产品方法论!(教科书一般的经典)

热门文章

  1. dz论坛在线时间更新机理分析(解决在线时间不更新和部分用户刷在线时间的问题)
  2. 动态生成洛谷个人练习/估值数据
  3. python+anaconda安装教程
  4. python Panads获取股票数据及处理
  5. python机器学习minimize函数参数介绍及作用
  6. 【白话模电2】二极管特性和分类
  7. gitHub Action - workflow 概念和基本操作
  8. Azkaban的囚徒——Azkaban安装和介绍
  9. 【论文写作】如何表示比较关系, compare to OR compare with?
  10. android smb开源,搭建samba服务---实现跨平台文件共享