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文件写入实例分析
Apr 08 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
python tkinter实现屏保程序
Jul 30 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
详解用 python-docx 创建浮动图片
Jan 24 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学习笔记之一
2011/01/17 PHP
PHP 事件机制(2)
2011/03/23 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
javascript的函数
2007/01/31 Javascript
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
vue实现底部菜单功能
2018/07/24 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
深入学习Python中的装饰器使用
2016/06/20 Python
python利用微信公众号实现报警功能
2018/06/10 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python用input输入列表的实例代码
2020/02/07 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
公司拓展活动方案
2014/02/13 职场文书
财务科科长岗位职责
2014/03/10 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL