← トップ
16 / 20

16. デコレータ(decorator)

CONCEPT

デコレータdecorator(デコレータ)。関数を包んで機能を追加するは、関数に「追加機能」をつける仕組みです。スマホのケースをつけるようなもので、元の関数を変えずに機能を追加できます。

📍 使い道: 「実行時間を測る」機能をデコレータで共通化
COMMON MISTAKES — よくある間違い
@ を付け忘れるデコレータは @my_decorator のように関数定義の直前に @ 付きで書きます。
デコレータが元の関数を変えると思っているデコレータは関数を「包む」ものであり、元の関数自体を書き換えるわけではありません。
コードを1行ずつ実行してみよう
example.pyPython
1@timer# @timer デコレータを宣言 — この関数に timer 機能を追加
2def process_orders(orders):# process_orders 関数を定義(timer でラップされる)
3 total = sum(order["price"] for order in orders)# order["price"] の合計を計算 → total = 800
4 return total# total を返す + timer が実行時間を表示
« 次の行 » ボタンを押して実行を開始
VARIABLES
実行すると変数の状態が表示されます
デコレータは「関数に機能を追加するラッパー」です。 @timer と関数の上に書くだけで、その関数の実行時間が測れるようになります。 関数の中身を変えずに機能を追加できるのがポイントです。
📚 読み方ガイド
コード読み方
@timerこの関数に timerタイマー(英: timer)という追加機能をつけて、という宣言
def process_orders(orders):元の関数 process_orders注文を処理する(英: process=処理、orders=注文) の定義
process_orders = timer(process_orders)@timer は実質的にこれと同じ意味
def wrapper(*args, **kwargs):デコレータの内部で動くラッパー関数
KEY POINT

@timerタイマー — 計時 = 「この関数に timer という追加機能をつけて」という宣言。@ の下にある関数が対象。デコレータデコレータ — 関数を包んで機能追加自体は「関数を受け取って関数を返す関数」です。Flask や FastAPI でルーティングにも使われます。

デコレータあり vs なし
デコレータなし(手動呼び出し)
def greet(name): print(f"こんにちは、{name}") greet("田中") # 手動で呼ぶ
デコレータあり(機能追加)
@timer def greet(name): print(f"こんにちは、{name}") greet("田中") # 実行時間も表示
確認問題
1このコードは何を表示しますか?
@login_required def view_order_history(user): print(f"{user['name']}さんの注文履歴を表示") view_order_history({"name": "佐藤", "is_logged_in": False})
「ログインが必要です」と表示されます。is_logged_in が False のため、デコレータが関数の実行をブロックします。
2@timer がついている関数を実行すると、何が追加で起きますか?
@timer def process_orders(orders): total = sum(order["price"] for order in orders) return total
関数の実行時間が自動で計測され、「process_orders注文を処理する(英: process=処理、orders=注文): X.XX秒」と表示されます。元の関数の実行結果はそのまま返されます。
3@app.route("/api/orders") は何を意味していますか?
@app.route("/api/orders") def list_orders(): return {"orders": []}
「/api/orders にアクセスされたら list_orders 関数を実行する」というルーティングの設定です。Webフレームワーク(Flask等)でよく使われるパターンです。
CHEAT SHEET — まとめ
3行で分かる
  • 関数に「追加機能」を後付けする仕組み(@ 記号)
  • 元の関数を変えずに機能を足せる(スマホケースのような)
  • 共通処理(ログ・計測等)を複数関数に一括適用できる
デコレータ