Pythonには他の言語(Javaなど)と同様にデコレータ機能を利用することができます。
デコレータは「@」の後ろに独自の名前をつけて利用することができ、既存の関数を修正することなく効率的に機能を付加(装飾)することができます。
デコレータはその名の通り「装飾する人(もの)」であり関数などを外部から装飾するのに用いられます。
Pythonでデコレータを使う方法
Pythonではデコレータに「@」の後ろに独自の名前をつけて利用することができます。
ex. @sample_deco
作成したデコレータは装飾したい関数の前に記述します。
@f_trace
def test( x, y ):
def test( x, y ):
この例では「test」という関数を「f_trace」というデコレーターで装飾します。
デコレータのソースコード
以下に具体的なデコレータを利用したソースコードです。
よくある関数の呼び出し・終了を監視する処理をデコレータとして作成し、ログとして表示させてみます。
import datetime import time import inspect def f_trace( func ): def get_function_trace( *args, **kwargs ) : dt_now1 = datetime.datetime.now() func_name = str(inspect.stack()[ 1 ][ 4 ]) func_name = func_name.replace( '['' , '' ) func_name = func_name.replace( 'n']' , '' ) print( func_name + ' 開始[' + str( dt_now1 ) +']' ) func( *args, **kwargs ) dt_now2 = datetime.datetime.now() print( func_name + ' 終了[' + str( dt_now2 ) + ']' ) print( func_name + '処理時間[' + str( dt_now2 - dt_now1 ) + ']' ) return get_function_trace #デコレータを設定 @f_trace def test( x, y ): print( 'Hello Decorator x=[' + str( x ) + '] y=[' + str( y ) + ']' ) test( 1000, 2000 )
上記ソースで
- 「@f_trace」は関数にデコレータを設定しています。
- def f_traceはデコレータの名前を宣言しています。引数のfuncは呼出元の関数です。
- def get_function_traceはデコレータの具体的な処理を行っています。
- func( *args, **kwargs )は呼出元の関数を実行しています。
実際の動作としては
- デコレータの処理内で開始のログが表示される。
- 呼出元の関数が実行される
- デコレータの処理内で終了のログが表示される。
という順番で処理が実施されています。
実行結果は以下の通りになります。
C:python_test>python test_decopy test( 1000, 2000 ) 開始[2020-01-23 15:18:37.007053] Hello Decorator x=[1000] y=[2000] test( 1000, 2000 ) 終了[2020-01-23 15:18:40.017031] test( 1000, 2000 )処理時間[0:00:03.009978] C:python_test>
まとめ
Pythonでデコレータを上手く利用できると非常に大きなアドバンテージを持ってコーディングすることができるようになります。
ぜひ、いろいろなデコレータを作成して効率の良いプログラム開発を目指してください。
以上、Pythonでデコレータを使う方法でした。