【Python】デコレータ

コード

実行結果

f:id:toshinakatsu:20220411125602p:plain

コード説明

 デコレータとは、関数に処理を追加・デコレートする仕組みです。

 ここでは、mydecorated関数の実行前後にメッセージを出力する処理を追加する場合を考えてみます。mydecorator関数では、引数にデコレートされる関数を渡し、戻り値はデコレートされた後のinner_func関数となっています。inner_func関数内では、デコレートされる関数の実行前後にメッセージを出力しています。

 mydecorated関数の上に、@mydecoratorと記述することで、

mydocorated = mydocorator(mydocorated) と同じ意味になります。

 最終行で、mydecorated関数を呼び出すと、実質、デコレートされる元のmydecorated関数を記憶したinner_func関数を呼び出していることになります。

 実行結果から、mydecorated関数の実行前後にメッセージを出力できていることが分かります。

 ここで、mydecorator関数のような外側で定義した関数をエンクロージャ、inner_func関数のような内側で定義した関数をクロージャと呼ぶことにします。     

 すると、デコレータは、エンクロージャの引数に渡したデコレートされる元の関数を、クロージャ内に記憶させ処理を追加することで、元の関数をデコレートしていると言えます。クロージャをエンクロージャの戻り値とし、エンクロージャの引数にデコレートする関数を渡すことで、デコレートされた新たな関数を生成しています。

参考