无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法。

如果合理,可以直接将功能添加到对象所属的类(例如:添加一个新方法)

使用组合

使用继承

与继承相比,通常应该优先选择组合,因为继承使得代码更难复用,继承关系是静态的,并且用于整个类以及这个类的所有实例和网页。

设计模式为我们提供第四种可选方法,以支持动态地扩展一个对象的功能,这种方法就是修饰器。修饰器模式能够以透明的方式动态地将功能添加到一个对象中。

在许多编程语言中,使用子类化来实现修饰器模式。在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设计模式之修饰器模式相关推荐

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

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

  2. python 装饰器 继承_Python设计模式之装饰器模式

    装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...

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

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

  4. python设计模式9-装饰器模式

    1. 装饰器模式(Decorator)介绍 UML类图 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为 ...

  5. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  6. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  7. 为什么学习Python?选择学习Python的10个理由

    前言 为什么学习Python?选择学习Python的10个理由 Python提供了许多有用的功能特性,这些功能使其相比其他编程语言更流行也更易于学习.它支持面向对象的编程,也支持面向过程编程:我们在下 ...

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

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

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

    ####零.修饰器模式 当我们相对一个对象添加新功能的时候,无非就是下面这三种方法: 直接修改对象所属类 使用组合 使用继承 这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况 ...

最新文章

  1. vimdiff使用总结
  2. 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
  3. hdu3699(不等式dfs)
  4. python第k序列元素查找_Python寻找第k小的元素
  5. Ubuntu Vi 编辑器 命令(转)
  6. 盘点中兴通讯强悍的战斗力
  7. Java实验二 计算机 1501 王奕开 18
  8. ASP.NET页面之间传值Session(2)
  9. 鸿蒙智慧屏桌面,全球首发国产鸿蒙操作系统,荣耀智慧屏现场亲测
  10. Delphi 下用Windows API 创建窗体
  11. HTML Parsing Error KB927917
  12. uniapp 登录页跳转到首页
  13. Android power键亮屏流程
  14. python做卡牌游戏_python实现机器人卡牌
  15. 地理生物结业考_地理、生物结业主要考什么?
  16. 给高科技强国的后来者埋下的痛
  17. 0基础编程资源大全(先收藏~慢慢看~)
  18. 微信聊天气泡随意换,一键制作超级简单,让聊天不再枯燥!
  19. 企业使用混合云,主要有哪些好处?
  20. Markdown语法(常用语法,快速掌握)

热门文章

  1. mysql5.7.12 my.ini文件_MySQL5.7缺少my.ini文件的解决方法
  2. pythonfor循环100次_【零基础学Python】For循环和RANGE()函数
  3. Android调用系统相机和相册(更换微信头像)
  4. 通过调色板(QPalette)将readonly为true的QLineEdit颜色设置为灰色
  5. java 固定listview_listview Button始终放在底部示例
  6. 关于如何查看mysql版本及其端口号
  7. Timer和TimerTask详解
  8. access集团和abm_ACCESS集团宣布启动“ABM单创66会员狂欢节”
  9. 六招轻松搞定你的CentOS系统安全加固
  10. Test传送门(更新中)