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采用socket模拟TCP通讯的实现方法
Nov 19 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
python Kmeans算法原理深入解析
Aug 23 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
如何定义TensorFlow输入节点
Jan 23 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python 装饰器的基本使用
Jan 13 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
php 中的str_replace 函数总结
2007/04/27 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
PHP实现简单登录界面
2019/10/23 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
require.js的用法详解
2015/10/20 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
Python学习小技巧之列表项的排序
2017/05/20 Python
pycharm创建一个python包方法图解
2019/04/10 Python
python制作图片缩略图
2019/04/30 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
公司感谢信范文
2015/01/22 职场文书
公司门卫岗位职责
2015/04/13 职场文书
保护动物的宣传语
2015/07/13 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang