python decorator模块_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模式实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值