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使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
深入讲解Python编程中的字符串
Oct 14 Python
python与php实现分割文件代码
Mar 06 Python
详解Python之unittest单元测试代码
Jan 24 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
基于python指定包的安装路径方法
Oct 27 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
python爬虫之遍历单个域名
Nov 20 Python
python之生成多层json结构的实现
Feb 27 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php 判断数组是几维数组
2013/03/20 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
给ECShop添加最新评论
2015/01/07 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
Vue数据双向绑定的深入探究
2018/11/27 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
在Python中实现字典反转案例
2020/12/05 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
中科软测试工程师面试题
2012/06/16 面试题
公路绿化方案
2014/05/12 职场文书
代收款委托书范本
2014/10/01 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
小王子读书笔记
2015/06/29 职场文书
linux目录管理方法介绍
2022/06/01 Servers