【でこれーたー】
デコレーター とは?
最終更新:
💡 関数やクラスに、共通の処理を組み込む仕組み
関数やクラスなどに処理を適用し、機能や振る舞いを追加・変更する仕組み。Pythonでは@構文で適用し、返された値を関数名などに結び直す。対象や仕組みは言語によって異なる。
📌 このページのポイント
- 元の関数本体を直接書き換えず、呼び出し時の振る舞いを変えられる
- Pythonでは関数・クラスの定義の上に@構文で書く
- ログ・認証・キャッシュなどの共通処理に使える
- PythonとTypeScriptでは対象や引数、適用の仕組みが異なる
デコレーターって具体的にどういうもの?
Pythonなら、たとえば自作のlog_decoratorを@log_decoratorと関数の上に書く。定義時に元の関数を受け取り、戻り値がその関数名に結び付くんだ。元の関数を呼ぶ前後にログを出すラッパーを返せば、呼び出すたびにログを記録できるよ。
関数本体を変えないなら、動作も同じ?
本体のコードを直接書き換えないだけで、動作は変えられるよ。認証に失敗したら元の関数を呼ばない、といった処理も作れる。@を書くだけで何でもできるわけではなく、対応するデコレーターの実装や読み込みが必要なんだ。
複数重ねると、どの順番になるの?
Pythonで上に@a、下に@bを書くと、適用結果はf = a(b(f))に相当する。元の関数に近いbを先に適用するんだ。その後f()を呼んだときの実行順は、返されたラッパーなどの実装で決まるよ。
元の関数名が見えなくならない?
ラッパーに置き換えると、そのままでは名前や説明文がラッパー側になることがある。Pythonのfunctools.wrapsを使うと、元の関数の名前やdocstringなどを引き継げるよ。
TypeScriptでも同じなの?
クラスやメソッドなどを再利用可能な処理で変更できるけれど、Pythonと同じ仕様ではないよ。TypeScript 5.0で対応した新方式と、experimentalDecoratorsを使う従来方式も違う。利用するライブラリとコンパイラー設定に合う書き方を確認しよう。
まとめ:ざっくりこれだけ覚えればOK!
「デコレーター」って出てきたら「関数やクラスに処理を組み込む仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「decorator」 = 装飾するもの
💬 decorateは「飾り付ける」。コードの定義に処理を付け加えるイメージだけれど、実際の動作を変えることもできるよ。