python模式选择符,Python设计模式之修饰器模式
无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法。
如果合理,可以直接将功能添加到对象所属的类(例如:添加一个新方法)
使用组合
使用继承
与继承相比,通常应该优先选择组合,因为继承使得代码更难复用,继承关系是静态的,并且用于整个类以及这个类的所有实例和网页。
设计模式为我们提供第四种可选方法,以支持动态地扩展一个对象的功能,这种方法就是修饰器。修饰器模式能够以透明的方式动态地将功能添加到一个对象中。
在许多编程语言中,使用子类化来实现修饰器模式。在Python中,我们可以使用内置的修饰器特性。一个Python修饰器就是对Python语法的一个特定改变。用于扩展一个类、方法或函数的行为,而无需使用继承。从实现的角度来说,Python修饰器是一个可调用对象,接受一个函数对象fin作为输入,并返回另一个函数对象fout。这意味着可以将任何具有这些属性的可调用对象当作一个修饰器。
修饰器模式和Python修饰器之间并不是一对一的等价关系。Python修饰器能做的实际上比修饰器模式多得多,其中之一就是实现修饰器模式和网页。
"""
装饰器模板:
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
"""
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个数字的和'''
assert(n >= 0), 'n must be >= 0'
return 0 if n == 0 else n+nsum(n-1)
@memoize
def fibonacci(n):
'''返回斐波那契数列的第n个数'''
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(200)', '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()))
python模式选择符,Python设计模式之修饰器模式相关推荐
- python修饰器_python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
- python 装饰器 继承_Python设计模式之装饰器模式
装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...
- python 修饰器 教程_python 实现 修饰器模式
无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继 ...
- python设计模式9-装饰器模式
1. 装饰器模式(Decorator)介绍 UML类图 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 为什么学习Python?选择学习Python的10个理由
前言 为什么学习Python?选择学习Python的10个理由 Python提供了许多有用的功能特性,这些功能使其相比其他编程语言更流行也更易于学习.它支持面向对象的编程,也支持面向过程编程:我们在下 ...
- 结构型模式---修饰器模式
修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法.1.如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)2.使用组合3.使用继承 与继承相比,通常应该优 ...
- 第六天:结构型模式--修饰器模式
####零.修饰器模式 当我们相对一个对象添加新功能的时候,无非就是下面这三种方法: 直接修改对象所属类 使用组合 使用继承 这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况 ...
最新文章
- vimdiff使用总结
- 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
- hdu3699(不等式dfs)
- python第k序列元素查找_Python寻找第k小的元素
- Ubuntu Vi 编辑器 命令(转)
- 盘点中兴通讯强悍的战斗力
- Java实验二 计算机 1501 王奕开 18
- ASP.NET页面之间传值Session(2)
- 鸿蒙智慧屏桌面,全球首发国产鸿蒙操作系统,荣耀智慧屏现场亲测
- Delphi 下用Windows API 创建窗体
- HTML Parsing Error KB927917
- uniapp 登录页跳转到首页
- Android power键亮屏流程
- python做卡牌游戏_python实现机器人卡牌
- 地理生物结业考_地理、生物结业主要考什么?
- 给高科技强国的后来者埋下的痛
- 0基础编程资源大全(先收藏~慢慢看~)
- 微信聊天气泡随意换,一键制作超级简单,让聊天不再枯燥!
- 企业使用混合云,主要有哪些好处?
- Markdown语法(常用语法,快速掌握)
热门文章
- mysql5.7.12 my.ini文件_MySQL5.7缺少my.ini文件的解决方法
- pythonfor循环100次_【零基础学Python】For循环和RANGE()函数
- Android调用系统相机和相册(更换微信头像)
- 通过调色板(QPalette)将readonly为true的QLineEdit颜色设置为灰色
- java 固定listview_listview Button始终放在底部示例
- 关于如何查看mysql版本及其端口号
- Timer和TimerTask详解
- access集团和abm_ACCESS集团宣布启动“ABM单创66会员狂欢节”
- 六招轻松搞定你的CentOS系统安全加固
- Test传送门(更新中)