【でこれーたー】

デコレーター とは?

💡 関数に「トッピング」を乗せる仕組み
📌 このページのポイント
デコレーター ― 関数に機能を追加する 元の関数 def hello(): 挨拶を返す @log_decorator ログ出力(実行前) hello() 実行 ログ出力(実行後) 結果 元の機能 追加機能 よく使われるデコレーターの例 @login_required @cache @retry
デコレーターのイメージ
ひよこ ひよこ

デコレーターって具体的にどういうものなの?

ペンギン先生 ペンギン先生

たとえばPythonで@login_requiredと関数の上に書くと、その関数が呼ばれるたびに「ログインしているか」を自動でチェックしてくれるんだ。関数本体のコードは一切変えなくていい。ケーキの上にトッピングを乗せるみたいに、追加機能を「上から被せる」イメージだよ。

ひよこ ひよこ

普通に関数の中に処理を書くのとどう違うの?

ペンギン先生 ペンギン先生

たとえば10個の関数すべてに「実行時間を計測する処理」を入れたいとき、全部の関数に同じコードを書くのは面倒だし保守が大変だよね。デコレーターを使えば@measure_timeと1行書くだけで全部に適用できる。「同じ処理を何度も書かない」というDRY原則に沿った設計なんだ。

ひよこ ひよこ

デコレーターを使うときの注意点ってある?

ペンギン先生 ペンギン先生

デコレーターを何重にも重ねすぎると、実行順序がわかりにくくなるのが注意点だね。上から下に書いた順番で適用されるけど、実行は内側から外側に向かって行われるから混乱しやすい。あとデバッグのときにスタックトレースが見づらくなることもあるから、Pythonではfunctools.wrapsを使って元の関数情報を保持するのがお作法だよ。

ひよこ ひよこ

TypeScriptJavaScriptでもデコレーターが使えるって聞いたけど?

ペンギン先生 ペンギン先生

TC39のStage 3提案として標準化が進んでいて、TypeScript 5.0からES Decoratorsがサポートされたよ。Angular、NestJS、MobXなどのフレームワークでは以前から「実験的デコレーター」が使われてきたんだ。実はPythonのデコレーターとJavaアノテーション(@Override、@Deprecated)は見た目が似ているけど仕組みが全く違うんだよ。Pythonのデコレーターは関数を受け取って新しい関数を返す「高階関数」で、Javaアノテーションメタデータを付与するだけ。この違いを理解しておくと言語を行き来するときに混乱しないよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「デコレーター」って出てきたら「関数やクラスに後付けで機能を追加する仕組みだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「decorator」 = 装飾するもの
💬 decorateは「飾り付ける」という意味。元のものを変えずにデコレーション(飾り)を追加するイメージだよ
← 用語集にもどる