装饰器只是返回替换的可调用对象,可以选择相同的函数、包装器或完全不同的东西。因此,您可以创建一个条件装饰器:
def conditional_decorator(dec, condition):
def decorator(func):
if not condition:
# Return the function unchanged, not decorated.
return func
return dec(func)
return decorator
现在你可以像这样使用它:
@conditional_decorator(timeit, doing_performance_analysis)
def foo():
time.sleep(2)
装饰器也可以是一个类:
class conditional_decorator(object):
def __init__(self, dec, condition):
self.decorator = dec
self.condition = condition
def __call__(self, func):
if not self.condition:
# Return the function unchanged, not decorated.
return func
return self.decorator(func)
这里的__call__
方法与第一个示例中返回的嵌套函数的作用相同,这里decorator()
的封闭dec
和condition
参数作为参数存储在实例上,直到应用装饰器。