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 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
使用Python脚本来获取Cisco设备信息的示例
May 04 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 Python
python可视化text()函数使用详解
Feb 11 Python
python 错误处理 assert详解
Apr 20 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
Python3合并两个有序数组代码实例
Aug 11 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笔记之常用文件操作
2010/10/12 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
python基础教程项目二之画幅好画
2018/04/02 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
python实现可逆简单的加密算法
2019/03/22 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
大三自我鉴定范文
2013/10/05 职场文书
大学生学习生活的自我评价
2013/11/01 职场文书
音乐专业自荐信
2014/02/07 职场文书
教师对学生的评语
2014/04/28 职场文书
环保专项行动方案
2014/05/12 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
升学宴答谢词
2015/01/05 职场文书
云冈石窟导游词
2015/02/04 职场文书
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫