本文研究的主要是python实现Decorator模式,具体介绍如下。
一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# -*- 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
就是一个装饰器,其作用也很简单,打印被装饰函数运行时间。
装饰器的语法如下:
1
2
3
|
@dec def func(): pass |
本质上等同于: func = dec(func)
。
在上面的代码(code snippet 0)中,把line12注释掉,然后把line18的注释去掉,是一样的效果。另外staticmethod和classmethod是两个我们经常在代码中用到的装饰器,如果对pyc反编译,得到的代码一般也都是 func = staticmthod(func)
这种模式。当然,@符号的形式更受欢迎些,至少可以少拼写一次函数名。
实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#-*-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模式实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/jklfjsdj79hiofo/article/details/8679779