全部博文(214)
分类:
2008-04-16 23:53:14
Python中在2.4中加入一种新的语法元素Decorator,从字面上讲这个语法元素是一个修饰符,在Dr.Dobb’s的文章中有这样一段描述”Decorators are Python objects that can register,annotate,and/or wrap a Python function or object”,个人理解就是对一个函数进行调用前做些额外的处理,有点像挂函数钩子,执行这个函数前先经过一个处理后再真正调用这个函数本身,这个语法的出现最早也是为了方便的实现classmethod和staticmethod的调用。Deocrator在Python元编程里有很重要的作用,这方面的概念跟Java中的反射很相似,下面的例子是说明Decorator的一个简单应用。
不用Decorator
class democlass: def demomethod(cls,x,y): print ‘class something : somemethod %d , %d’ % (x,y) demomethod = classmethod(demomethod) |
---|
使用Decorator
class democlass: @classmethod def demomethod(cls,x,y): print ‘class something : somemethod %d , %d’ % (x,y) |
---|
(一)Decorator应用之一:Trace 函数
这个是最普通的一个应用,使用Trace函数或一个Trace类可以知道一个函数的状态和参数,这个功能可以很方便的帮助你调试代码,了解当前的运行情况,这里将用到下面几个知识点Function as Decorator、Object as Decorator、Decorator with arguments(参数)
1.Function Decorator
def traced(func): def wrapper(*__args,**__kw): print ‘entering’,func,__args,__kw try: return func(*__args,**__kw) finally: print ‘exiting’,func return wrapper |
---|
2.Class Decorator
class traced: def __init__(self,func): self._func = func def __call__(__self,*__args,**__kw): print ‘entering’,__self._func try: return __self._func(*__args,**__kw) finally: print ‘exiting’,__self._func @traced if __name__ == ‘__main__’: demofun(0,1) ======程序将有如下的输出====== entering |
---|
3.Decorator with arguments
如果你想在trace的信息中加入一些其它的信息,比如说作者,日期什么的这时候可以按下面的代码提供这些信息
def traced(author_name): def dec(func): func._author_name = author_name def wrapper(*__args,**__kw): print ‘entering’,func,__args,func.__dict__ try: return func(*__args,**__kw) finally: print ‘exiting’,func return wrapper return dec |
---|