Python の デコレータ

用途
複数のメソッドに共通の前処理と後処理を付加できる。
 

ポイント
1) デコレーターは、デコレートされた関数を返す。
2) デコレートする関数の中身の記述は変えられない。
 

サンプル
① 以下は pre do, post do を前後に出力するデコレータ。

>>> def decorate(func):        # func を deco します。
...   # 以下は deco された func を定義します。
...   def decorated_func(*args, **kwargs):  
...     print("pre do")        # 前処理
...     func(*args, **kwargs)  # func の処理
...     print("post do")       # 後処理
...   return decorated_func    # deco された func を返します。
... 
>>>
>>> # 書き方1
>>> def func(a, b):
...   print(a + ", " + b + "!")
>>> func = decorate(func)
>>>
>>>
>>> # 書き方2
>>> @decorate
... def func(a, b):
...   print(a + ", " + b + "!")
... 
>>>
>>> 
>>> func("Hello", "world")
pre do
Hello, world!
post do

 

② デコレータに引数を渡す場合
param が True の時だけ deco するように変更します。

>>> def create_decorator(param):
...   def decorate(func):
...     def decorated_func(*args, **kwargs):
...       if param:
...         print("pre do")
...         func(*args, **kwargs)
...         print("post do")
...       else:
...         func()
...     return decorated_func
...   return decorate
... 
>>> 
>>> param = True
>>>
>>> # 書き方1
>>> # デコレータに引数セットしてデコレータを生成
>>> decorate = create_decorator(param)
>>>
>>> def func(a, b):
...   print(a + ", " + b + "!")
>>>
>>> # 引数がセットされたデコレータで func をデコレート
>>> decorated_func = decorate(func)
>>>
>>>
>>> # 書き方2
>>> @create_decorator(param)
... def func(a, b):
...   print(a + ", " + b + "!")
... 
>>>