使用在Python 2.4 or Later.

两种调用形式:
1.不带参数

@A

def f():

Python最后会处理为:

= A(f)

,可扩展为:

@A
@B
@C
def f():

最终Python会处理为:

= A(B(C(f)))

 

2.带参数:

@A(args)
def f():

Python会处理为:

def f();
  _deco 
= A(args)
  f 
= _deco(f)

Python先执行A(args)得到_deco,然后跟第一种方式一样的处理函数f。


对应的两种函数定义方法:
第一种:

def A(func):
  
#处理func
  #如func.attr='decorated'
  return func

@A
def f(args): pass

A对f处理完后,仍返回函数对象。 如果要返回一个新的函数,可以为:

def A(func):
  
#做额外的工作
  def new_func(args):
    
#做额外工作
    return func(args)  
  
return new_func

@A
def f(args): pass

注意:new_func的定义形式要和待处理的函数相同。

如果想根据原来函数的结果进行一些处理:

def A(func):
  
def new_func(*args, **argkw):
    result 
= func(*args, **argkw)
    
if result:
      
return new_result
    
else:
      
return result
  
return new_func

@A
def f(args): pass


 

第二种: 

def A(arg):
  
def _A(func):
    
def new_func(args):
      
#do any operation
      return func(args)
    
return new_func
  
return _A

@A(arg)
def f(args): pass

文档上说:如果你的decorator在调用时使用了参数,那么你的decorator函数只会使用这些参数进行调用。因此你需要返回一个新的decorator函数,就和第一种方式定义形式一致了。