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在命令行下使用google翻译(带语音)
Jan 16 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
python write无法写入文件的解决方法
Jan 23 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
基于python监控程序是否关闭
Jan 14 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
python 实现端口扫描工具
Dec 18 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
大学生村官考核材料
2014/05/23 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python