python实现Decorator模式实例代码


Posted in Python onFebruary 09, 2018

本文研究的主要是python实现Decorator模式,具体介绍如下。

一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子:

# -*- coding: utf-8 -*-
def log_cost_time(func):
  def wrapped(*args, **kwargs):
    import time
    begin = time.time()
    try:
      return func(*args, **kwargs)
    finally:
      print 'func %s cost %s' % (func.__name__, time.time() - begin)
  return wrapped
 
@log_cost_time
def complex_func(num):
  ret = 0
  for i in xrange(num):
    ret += i * i
  return ret
#complex_func = log_cost_time(complex_func)
 
if __name__ == '__main__':
  print complex_func(100000)
 
code snippet 0

代码中,函数log_cost_time就是一个装饰器,其作用也很简单,打印被装饰函数运行时间。

装饰器的语法如下:

@dec

def func():pass

本质上等同于: func = dec(func)

在上面的代码(code snippet 0)中,把line12注释掉,然后把line18的注释去掉,是一样的效果。另外staticmethod和classmethod是两个我们经常在代码中用到的装饰器,如果对pyc反编译,得到的代码一般也都是 func = staticmthod(func)这种模式。当然,@符号的形式更受欢迎些,至少可以少拼写一次函数名。

实例代码

#-*-coding:utf-8-*-


'''
意图:动态地给一个对象添加一些额外的职责。比通过生成子类更为灵活
'''
from abc import ABCMeta

class Component():
  __metaclass__ = ABCMeta
  def __init__(self):
    pass
  def operation(self):
    pass
  
class ConcreteComponent(Component):
  def operation(self):
    print 'ConcreteComponent operation...'

class Decorator(Component):
  def __init__(self, comp):
    self._comp = comp
  def operation(self):
    pass

class ConcreteDecorator(Decorator):
  def operation(self):
    self._comp.operation()
    self.addedBehavior()
  def addedBehavior(self):
    print 'ConcreteDecorator addedBehavior...' 
       
if __name__ == "__main__":
   comp = ConcreteComponent()
   dec = ConcreteDecorator(comp)
   dec.operation()

结果

======================= RESTART: C:/Python27/0209.2.py =======================
ConcreteComponent operation...
ConcreteDecorator addedBehavior...
>>>

总结

以上就是本文关于python实现Decorator模式实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
详解Python中用于计算指数的exp()方法
May 14 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
利用Python如何生成便签图片详解
Jul 09 Python
python list转矩阵的实例讲解
Aug 04 Python
Django stark组件使用及原理详解
Aug 22 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Django返回HTML文件的实现方法
Sep 17 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
Python多线程扫描端口代码示例
Feb 09 #Python
Python编程实现从字典中提取子集的方法分析
Feb 09 #Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 #Python
python删除服务器文件代码示例
Feb 09 #Python
详解Python使用tensorflow入门指南
Feb 09 #Python
python编程测试电脑开启最大线程数实例代码
Feb 09 #Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 #Python
You might like
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
javascript如何写热点图
2015/12/08 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Django入门使用示例
2017/12/12 Python
python处理csv中的空值方法
2018/06/22 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Python 学习教程之networkx
2019/04/15 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
python实现从wind导入数据
2019/12/03 Python
如何在django中运行scrapy框架
2020/04/22 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
英文商务邀请信
2014/01/22 职场文书
离婚协议书样本
2015/01/26 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
西游降魔篇观后感
2015/06/15 职场文书
python实现网络五子棋
2021/04/11 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang