在python中也有decorate的概念,装饰器是一个函数,其主要作用是包装另一个函数或者类。他可以透明的修改或者增加被包装对象的行为。
@trace
def square(x):
return x*x
等价于:
def square(x):
return x*x
square = trace(square)
函数本身被传递给trace(),后者返回一个对象替代原始的square.
例如:
enable_tracing=True
if enable_tracing:
debug_log=open("debug.log","w")
def trace(func):
if enable_tracing:
def callf(*args.**kwargs):
debug_log.write("Calling %s:%s,%s\n" %(func.__name__,args,kwargs))
r=func(*args,**kwargs)
debug_log.write("%s returned %s\n" %(func.__name__,r))
return r
return callf
else:
return func
1.使用装饰器时,必须按照他们的出现的先后顺序应用。
2.装饰器也可以使用参数,只接受带有@描述符的参数,接着返回在调用时使用函数作为参数的函数。
3.类也可以使用装饰器。在类定义之前声明。应该让类装饰器函数始终返回同类对象作为结果。需要使用原始类定义的代码可能要直接引用类成员。