python实现Decorator模式实例代码
本文研究的主要是python实现Decorator模式,具体介绍如下。
一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子:
#-*-coding:utf-8-*- deflog_cost_time(func): defwrapped(*args,**kwargs): importtime begin=time.time() try: returnfunc(*args,**kwargs) finally: print'func%scost%s'%(func.__name__,time.time()-begin) returnwrapped @log_cost_time defcomplex_func(num): ret=0 foriinxrange(num): ret+=i*i returnret #complex_func=log_cost_time(complex_func) if__name__=='__main__': printcomplex_func(100000) codesnippet0
代码中,函数log_cost_time就是一个装饰器,其作用也很简单,打印被装饰函数运行时间。
装饰器的语法如下:
@dec deffunc():pass
本质上等同于:func=dec(func)。
在上面的代码(codesnippet0)中,把line12注释掉,然后把line18的注释去掉,是一样的效果。另外staticmethod和classmethod是两个我们经常在代码中用到的装饰器,如果对pyc反编译,得到的代码一般也都是func=staticmthod(func)这种模式。当然,@符号的形式更受欢迎些,至少可以少拼写一次函数名。
实例代码
#-*-coding:utf-8-*- ''' 意图:动态地给一个对象添加一些额外的职责。比通过生成子类更为灵活 ''' fromabcimportABCMeta classComponent(): __metaclass__=ABCMeta def__init__(self): pass defoperation(self): pass classConcreteComponent(Component): defoperation(self): print'ConcreteComponentoperation...' classDecorator(Component): def__init__(self,comp): self._comp=comp defoperation(self): pass classConcreteDecorator(Decorator): defoperation(self): self._comp.operation() self.addedBehavior() defaddedBehavior(self): print'ConcreteDecoratoraddedBehavior...' if__name__=="__main__": comp=ConcreteComponent() dec=ConcreteDecorator(comp) dec.operation()
结果
=======================RESTART:C:/Python27/0209.2.py=======================
ConcreteComponentoperation...
ConcreteDecoratoraddedBehavior...
>>>
总结
以上就是本文关于python实现Decorator模式实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!