本文研究的主要是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模式实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
本文向大家介绍java 装饰模式(Decorator Pattern)详解及实例代码,包括了java 装饰模式(Decorator Pattern)详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来
本文向大家介绍C#装饰器模式(Decorator Pattern)实例教程,包括了C#装饰器模式(Decorator Pattern)实例教程的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式详细讲述了C#装饰器模式的实现方法。分享给大家供大家参考。具体实现方法如下: 现假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格。最终呈现出来的效果是:把产品组合的所有元素
本文向大家介绍Python 实现链表实例代码,包括了Python 实现链表实例代码的使用技巧和注意事项,需要的朋友参考一下 Python 实现链表实例代码 前言 算法和数据结构是一个亘古不变的话题,作为一个程序员,掌握常用的数据结构实现是非常非常的有必要的。 实现清单 实现链表,本质上和语言是无关的。但是灵活度却和实现它的语言密切相关。今天用Python来实现一下,包含如下操作: 生成这样的一个方
本文向大家介绍学习php设计模式 php实现装饰器模式(decorator),包括了学习php设计模式 php实现装饰器模式(decorator)的使用技巧和注意事项,需要的朋友参考一下 动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活【GOF95】 装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责。这也就是说,客户端并不会觉得对象在装饰前
本文向大家介绍Python post请求实现代码实例,包括了Python post请求实现代码实例的使用技巧和注意事项,需要的朋友参考一下 使用post请求登陆小极客网 1、获取登陆接口,及用户名和密码参数 进入小极客网,先注册个账户,修改用户名和密码,然后点击登陆,打开debug调试-进入到network下 输入用户名和密码,点击登陆 如下图:获得登陆接口:http://www.xi
本文向大家介绍Python ATM功能实现代码实例,包括了Python ATM功能实现代码实例的使用技巧和注意事项,需要的朋友参考一下 编写ATM程序实现下述功能,数据来源于文件db.txt 1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改 2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱 3、提现功能:用户输入提现金额,db.txt中该
本文向大家介绍Python ldap实现登录实例代码,包括了Python ldap实现登录实例代码的使用技巧和注意事项,需要的朋友参考一下 下面一段代码是小编给大家介绍的Python ldap实现登录实例代码,一起看看吧
本文向大家介绍Python实现EM算法实例代码,包括了Python实现EM算法实例代码的使用技巧和注意事项,需要的朋友参考一下 EM算法实例 通过实例可以快速了解EM算法的基本思想,具体推导请点文末链接。图a是让我们预热的,图b是EM算法的实例。 这是一个抛硬币的例子,H表示正面向上,T表示反面向上,参数θ表示正面朝上的概率。硬币有两个,A和B,硬币是有偏的。本次实验总共做了5组,每组随机选一个硬