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 不关闭控制台的实现方法
Oct 23 Python
浅谈Python数据类型之间的转换
Jun 08 Python
python实现K最近邻算法
Jan 29 Python
基于Python实现的微信好友数据分析
Feb 26 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
python简单区块链模拟详解
Jul 03 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
举例讲解Python装饰器
Dec 24 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
浅谈Python中的正则表达式
Jun 28 Python
如何使用pdb进行Python调试
Jun 30 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/10/20 PHP
实例讲解php数据访问
2016/05/09 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
pycharm 安装JPype的教程
2019/08/08 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python 实现音频叠加的示例
2020/10/29 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
2014年教研活动总结范文
2014/04/26 职场文书
总经理检讨书
2014/09/15 职场文书
乒乓球比赛通知
2015/04/27 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
Python内置数据结构列表与元组示例详解
2021/08/04 Python