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正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
Python中3种内建数据结构:列表、元组和字典
Nov 30 Python
举例讲解Python中的算数运算符的用法
May 13 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
pyinstaller还原python代码过程图解
Jan 08 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
浅谈Python类的单继承相关知识
May 12 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
通过html表格发电子邮件
2006/10/09 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
JavaScript去掉空格的方法集合
2010/12/28 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
js实现简易ATM功能
2020/10/27 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
Python单例模式实例详解
2017/03/01 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
python的Jenkins接口调用方式
2020/05/12 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
应届护士推荐信
2013/11/16 职场文书
实习指导老师意见
2015/06/04 职场文书