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中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
详解Python中的日志模块logging
Jun 19 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
django如何自己创建一个中间件
Jul 24 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
超级实用的8个Python列表技巧
Aug 24 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
多重?l件?合查?(二)
2006/10/09 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jquery each()源代码
2011/02/14 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
django的model操作汇整详解
2019/07/26 Python
python编写俄罗斯方块
2020/03/13 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
《天游峰的扫路人》教学反思
2014/04/25 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript
Django分页器的用法你都了解吗
2021/05/26 Python