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文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
Python中的自省(反射)详解
Jun 02 Python
Python实现注册登录系统
Aug 08 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
python面向对象法实现图书管理系统
Apr 19 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
Python箱型图处理离群点的例子
Dec 09 Python
Python控制台实现交互式环境执行
Jun 09 Python
Pycharm中如何关掉python console
Oct 27 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
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
XML的代替者----JSON
2007/07/21 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python 实现try重新执行
2019/12/21 Python
Python新手学习标准库模块命名
2020/05/29 Python
python 如何快速复制序列
2020/09/07 Python
如何利用python生成MD5并去重
2020/12/07 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
详解Python中的Lock和Rlock
2021/01/26 Python
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
办公室主任岗位承诺书
2014/05/29 职场文书
运动会加油稿100字
2014/09/19 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2015年共青团工作总结
2015/05/15 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书