デコレータは、置換、オプションで同じ関数、ラッパー、またはまったく異なるものを返す単純な呼び出し可能オブジェクトです。そのため、条件付きデコレータを作成できます。
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
パラメーターは、デコレーターが適用されるまでインスタンスの引数として格納されます。