使用在Python 2.4 or Later.
两种调用形式:
1.不带参数
@A
def f():Python最后会处理为:
f = A(f),可扩展为:
@A
@B
@C
def f():

最终Python会处理为:
f = 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): passA对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函数,就和第一种方式定义形式一致了。
本文详细介绍了Python中装饰器的两种使用形式及其实现原理。包括无参和有参装饰器的定义方法,以及如何通过装饰器修改或扩展被装饰函数的功能。
1206

被折叠的 条评论
为什么被折叠?



