首页 > 编程 > Python > 正文

python实现Decorator模式实例代码

2020-01-04 15:53:31
字体:
来源:转载
供稿:网友

本文研究的主要是python/268598.html">python/301648.html">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_timedef 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就是一个装饰器,其作用也很简单,打印被装饰函数运行时间。

装饰器的语法如下:

@decdef func():pass

本质上等同于: func = dec(func)

在上面的代码(code snippet 0)中,把line12注释掉,然后把line18的注释去掉,是一样的效果。另外staticmethod和classmethod是两个我们经常在代码中用到的装饰器,如果对pyc反编译,得到的代码一般也都是 func = staticmthod(func)这种模式。当然,@符号的形式更受欢迎些,至少可以少拼写一次函数名。

实例代码

#-*-coding:utf-8-*-'''意图:动态地给一个对象添加一些额外的职责。比通过生成子类更为灵活'''from abc import ABCMetaclass 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):    passclass 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教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表