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实现的简单文本类游戏实例
Apr 28 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
Python代码实现KNN算法
Dec 20 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
用PHP实现维护文件代码
2007/06/14 PHP
php图片上传类 附调用方法
2016/05/15 PHP
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python基于百度云文字识别API
2018/12/13 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python读取指定字节长度的文本方法
2019/08/27 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
建筑工程自我鉴定
2013/10/18 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python