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线程中对join方法的运用的教程
Apr 09 Python
Python实现批量下载文件
May 17 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
python连接mysql实例分享
Oct 09 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python实现时钟显示效果思路详解
Apr 11 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
在django中自定义字段Field详解
Dec 03 Python
如何利用Python识别图片中的文字
May 31 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
业余方法DIY电子管FM收音机
2021/03/02 无线电
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
javascript实现信息的显示和隐藏如注册页面
2013/12/03 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
linux下python抓屏实现方法
2015/05/22 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Python之时间和日期使用小结
2019/02/14 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
一套PHP的笔试题
2013/05/31 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
师德师风剖析材料
2014/09/30 职场文书
教代会开幕词
2015/01/28 职场文书
酒会邀请函
2015/01/31 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python