← クエスト一覧

クエスト79:デコレータを使おう

スライド 1 / 6
コーデ
💻 コード例
実行結果
← クエスト一覧
🐍 Python / Quest 79 / 85

クエスト79:デコレータを使おう

発展 +10 XP
🏠
今回の課題
関数の前後に「開始」「終了」を差しこむデコレータ logger を作り、greet に付けて動かそう。
📖 解説を見る
🎁 デコレータって何?

既存の関数に、中身を書きかえずに機能を「後付け」する仕組みです。関数の上に @名前 と書くだけで適用できます。

✏️ デコレータの形:
デコレータは「関数を受け取って、新しい関数を返す関数」です(Q78 のクロージャの応用)。形はいつもこうなります。
def デコレータ名(func):
    def wrapper(*args, **kwargs):
        # ← func の前にしたい処理
        result = func(*args, **kwargs)
        # ← func の後にしたい処理
        return result
    return wrapper

使うときは、付けたい関数の真上の行@デコレータ名 と書きます。

📋 作るもの:
logger… 関数 func を受け取り、実行の前に「開始」・後に「終了」を表示する新しい関数を返す
・その loggergreet に付ける(greet の中身は変えない)
greet('たろう') の結果が「開始」「こんにちは、たろう!」「終了」の3行になればOK

💡 どこで使う?

ログ出力・実行時間の計測・ログイン確認など、いろいろな関数に共通で足したい処理を1行で付けられます。Flask の @app.route@login_required もデコレータで、実務でも非常によく見かけます。

⚠️ ポイント:
@デコレータ名 を関数の真上の行に書く
・元の関数のコードは1文字も変えなくてよい
ヒントを見る
Q78 のクロージャと同じ形だよ。中で wrapper を定義して、func を呼ぶ前後に print をはさみ、最後に wrapper そのものを返そう。付けるときは greet の真上の行に @ を書くよ。
期待する出力
開始
こんにちは、たろう!
終了
📄 見本
「答えを見る」を押すと、お手本のコードが出ます。クリックでコピーできます。
💻 コードエディタ
実行すると結果がここに表示されます
正解!見本と同じになりました。
次へ →
🏠 ホームへ

れんしゅうもんだい

☑ 0 / 3 正解 レッスンに戻る

全問正解でクエストクリア!

未挑戦

問題 1: 関数実行前に「★実行中★」と表示するデコレータをつけて hello() を呼ぼう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
★実行中★ Hello!
未挑戦

問題 2: 関数の戻り値を2倍にするデコレータ doubler を使い、double_ten() が 20 を返すようにしよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
20
未挑戦

問題 3: 大文字に変換するデコレータ uppercase を使い、「HELLO WORLD」と表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
HELLO WORLD
コピーしました!