博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第六天:结构型模式--修饰器模式
阅读量:7032 次
发布时间:2019-06-28

本文共 1499 字,大约阅读时间需要 4 分钟。

零、修饰器模式

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

  • 直接修改对象所属类
  • 使用组合
  • 使用继承
    这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况我们才会使用继承。但是继承会导致代码难以服用,因为继承的关系是静态的,而且应用于整个类以及类的实例。这里我们引入修饰器模式作为第四种方法,修饰器模式优于组合和继承。
  • 什么是修饰器模式
    是对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@memoizedef nsum(n):    '''    返回前N个数字的和    :param n:    :return:    '''    assert (n >= 0), 'n must be >=0'    return 0 if n == 0 else n + nsum(n - 1)@memoizedef 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()))

转载于:https://www.cnblogs.com/BMFramework/p/10017249.html

你可能感兴趣的文章
centos 6.5 下安装配置GO 1.2.1
查看>>
Hudson持续集成工具安装配置指南
查看>>
Setting Up Tez Ui
查看>>
druid.io 从本地批(batch)导入数据与从hdfs 批导入数据的index task配置
查看>>
vue里实现echarts中国地图
查看>>
MapReducer之Mapper中的Split切片原理(即影响MapTask数目的原因)
查看>>
笨方法学 python
查看>>
多客户端上传服务器文档使用scp命令不需要输入密码
查看>>
Node.js的安装,以及测试环境
查看>>
ZSH--agnoster主题安装
查看>>
日常shell命令收集
查看>>
自定义异常
查看>>
我的友情链接
查看>>
Python中的random模块
查看>>
用的较为舒服的时间插件jQuery DateTimePicker
查看>>
CSS的样式继承、层叠、特殊性和重要性
查看>>
Windows8浅谈之Metro与经典Windows界面
查看>>
Python的流程控制 - if条件
查看>>
OpenLDAP的安装与基本配置(一)
查看>>
Dell(戴尔)电脑恢复BIOS出厂设置的方法
查看>>