第六天:结构型模式--修饰器模式
####零、修饰器模式
当我们相对一个对象添加新功能的时候,无非就是下面这三种方法:
- 直接修改对象所属类
- 使用组合
- 使用继承
这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况我们才会使用继承。但是继承会导致代码难以服用,因为继承的关系是静态的,而且应用于整个类以及类的实例。这里我们引入修饰器模式作为第四种方法,修饰器模式优于组合和继承。 - 什么是修饰器模式
是对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()))
第六天:结构型模式--修饰器模式相关推荐
- Java设计模式之结构型:装饰器模式
一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...
- 结构型模式---修饰器模式
修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法.1.如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)2.使用组合3.使用继承 与继承相比,通常应该优 ...
- Java设计模式之结构型:享元模式
一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...
- python模式选择符,Python设计模式之修饰器模式
无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如:添加一个新方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继承 ...
- 结构型设计模式之组合模式
结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...
- python 修饰器 教程_python 实现 修饰器模式
无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继 ...
- python修饰器_python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
- 修饰器模式(day04)
修饰器设计模式 --最近我给女朋友买了一款可以更换外壳的手机.现在的外壳是红色的,假如我想用这款手机的时候,会更换成银灰色的外壳.但是我不能随意更换天线或者话筒,因为这些功能模块在手机生产的时候就已经 ...
- php装饰器模式 简书,装饰器模式/包装器模式
在电视剧<相爱十年>中,主角肖然把出现了品控问题的安尔雅肥皂换了个包装.改了套说辞变成了全新的品牌浴雪清,并成功的推销出去了,得到了第一桶金.这就说所谓的包装,本质上并没有改变,但是外在表 ...
最新文章
- 余承东安卓鸿蒙,鸿蒙亮点多,网友嗨了!华为P50还没定,余承东:最强大操作系统...
- FCN全连接卷积网络(2)--读论文的过程理解
- CodeForces - 1454F Array Partition(线段树+二分)
- Scott Mitchell 的ASP.NET 2.0数据教程之三十九:: 在编辑和插入界面里添加验证控件...
- Arduino笔记-解决ESP8266上传代码时出现error: espcomm_upload_mem failed问题
- 快速上手Tomcat(eclipse中配置tomcat)
- jBPM与业务系统集成-通过定制Task Instance等方式实现
- Excel GET.DOCUMENT说明
- [转载]JSONP跨域的原理解析
- Android Studio 工程项目的结构
- Windows自带的几种截图快捷键使用方法记录
- 2017年苹果开发者账号申请——账号VISA卡支付流程
- Linux VPS 免费管理面板推荐
- 计算机数制转换操作方法,计算机数制转换新方法
- 表格自适应 css,css 表格自适应一些方法总结
- mysql创建新用户
- 谁是全球芯片行业的“麒麟才子”?得之可得天下!
- Kubernetes学习二:资源管理及入门实战
- 【3】天猫精灵开放实验平台实验— 切换意图,参数传递
- 微信十年,张小龙教给我们的产品方法论!(教科书一般的经典)
热门文章
- dz论坛在线时间更新机理分析(解决在线时间不更新和部分用户刷在线时间的问题)
- 动态生成洛谷个人练习/估值数据
- python+anaconda安装教程
- python Panads获取股票数据及处理
- python机器学习minimize函数参数介绍及作用
- 【白话模电2】二极管特性和分类
- gitHub Action - workflow 概念和基本操作
- Azkaban的囚徒——Azkaban安装和介绍
- 【论文写作】如何表示比较关系, compare to OR compare with?
- android smb开源,搭建samba服务---实现跨平台文件共享