Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690600
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

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
def demofun(x,y):
    print ‘call demofun’,x,y

if __name__ == ‘__main__’:

demofun(0,1)

======程序将有如下的输出======

entering
call demofun 0 1
exiting

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
阅读(939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~