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 相关文章推荐
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
如何利用python查找电脑文件
Apr 27 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Python如何调用JS文件中的函数
Aug 16 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
Python tkinter实现日期选择器
Feb 22 Python
用Python实现Newton插值法
Apr 17 Python
python中如何对多变量连续赋值
Jun 03 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读取csv文件内容的详解
2013/06/18 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
yii2实现 "上一篇,下一篇" 功能的代码实例
2017/02/04 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python 解析简单的XML数据
2020/07/24 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
美术专业个人自我评价
2014/01/18 职场文书
大型活动组织方案
2014/05/10 职场文书
保护环境的标语
2014/06/09 职场文书
毕业生实习证明
2014/09/19 职场文书
入党个人总结范文
2015/03/02 职场文书
班主任自我评价范文
2015/03/11 职场文书