コード
実行結果
コード説明
デコレータとは、関数に処理を追加・デコレートする仕組みです。
ここでは、mydecorated関数の実行前後にメッセージを出力する処理を追加する場合を考えてみます。mydecorator関数では、引数にデコレートされる関数を渡し、戻り値はデコレートされた後のinner_func関数となっています。inner_func関数内では、デコレートされる関数の実行前後にメッセージを出力しています。
mydecorated関数の上に、@mydecoratorと記述することで、
mydocorated = mydocorator(mydocorated) と同じ意味になります。
最終行で、mydecorated関数を呼び出すと、実質、デコレートされる元のmydecorated関数を記憶したinner_func関数を呼び出していることになります。
実行結果から、mydecorated関数の実行前後にメッセージを出力できていることが分かります。
ここで、mydecorator関数のような外側で定義した関数をエンクロージャ、inner_func関数のような内側で定義した関数をクロージャと呼ぶことにします。
すると、デコレータは、エンクロージャの引数に渡したデコレートされる元の関数を、クロージャ内に記憶させ処理を追加することで、元の関数をデコレートしていると言えます。クロージャをエンクロージャの戻り値とし、エンクロージャの引数にデコレートする関数を渡すことで、デコレートされた新たな関数を生成しています。
参考