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 提取文件的小程序
Jul 29 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
python学习基础之循环import及import过程
Apr 22 Python
使用TensorFlow实现SVM
Sep 06 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 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读取txt文本文件并分页显示的方法
2015/03/11 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
详解js类型判断
2018/05/22 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
js实现筛选功能
2020/11/24 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
python的re正则表达式实例代码
2018/01/24 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
自荐信的五个重要部分
2013/10/29 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
活动总结怎么写啊
2014/05/07 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL