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 域名分析工具实现代码
Jul 15 Python
python正则表达式re模块详细介绍
May 29 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
python获得一个月有多少天的方法
Jun 04 Python
python简单实现刷新智联简历
Mar 30 Python
python实现图片文件批量重命名
Mar 23 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
python 二维数组90度旋转的方法
Jan 28 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
python 列表推导和生成器表达式的使用
Feb 01 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作的文本留言本的例子(四)
2006/10/09 PHP
PHP 替换模板变量实现步骤
2009/08/24 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
vue移动端屏幕适配详解
2019/04/30 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Python编写打字训练小程序
2019/09/26 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
python 操作excel表格的方法
2020/12/05 Python
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
体育老师的教学自我评价分享
2013/11/19 职场文书
环境整治工作方案
2014/05/18 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
限期整改通知书
2015/04/22 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
详解Redis复制原理
2021/06/04 Redis