Python 装饰器

来源:互联网 发布:c语言不同数据类型运算 编辑:程序博客网 时间:2024/06/08 09:29

装饰器 decorator:可动态为函数添加新的功能

使用方法:

import time  def performance(f):                                                 #定义装饰器函数,并传入需要被包装的函数    def fn(*args, **kw):                                            #对传进来的函数进行包装的函数,此参数自适应任何参数定义的函数          t_start = time.time()                                       #记录函数开始时间           r = f(*args, **kw)                                          #调用函数          t_end = time.time()                                         #记录函数结束时间           print 'call %s() in %fs' % (f.__name__, (t_end - t_start))  #打印调用函数的属性信息,并打印调用函数所用的时间          return r                                                    #返回包装后的函数          return fn                                                       #调用包装后的函数   @performance                                                        #调用装饰器  def factorial(n):                                                   #定义乘数函数(需要包装的函数)      return reduce(lambda x, y: x * y, range(1, n + 1))  print factorial(10)            

上述装饰器属于无参装饰器,含参装饰器参考http://www.imooc.com/code/6066

带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收原函数并返回新函数

import timedef performance(unit):    def p_decorator(f):        def fn(*args, **kw):            t_start = time.time()            r = f(*args, **kw)            t_end = time.time()            print 'call %s() in %f%s' % (f.__name__, (t_end - t_start)*1000,unit)            return r        return fn    return p_decorator@performance('ms')def factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)


有时候我们需要将原函数的一些属性复制到新函数中
Python内置的functools可以用来自动化完成这个“复制”的任务

import time, functoolsdef performance(unit):    def p_decorator(f):        @functools.wraps(f)        def fn(*args, **kw):            t_start = time.time()            r = f(*args, **kw)            t_end = time.time()            print 'call %s() in %f%s' % (f.__name__, (t_end - t_start)*1000,unit)            return r        return fn    return p_decorator@performance('ms')def factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))print factorial.__name__