本文研究的主要是python实现Decorator模式,具体介绍如下。一般来说,装饰器是一个函数,接
本文研究的主要是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 decorator python decorator通俗 python decorator模块