【Python 】デコレータとは?を徹底解説!【初心者向け】

Python

(最終更新月:2021年12月)

「デコレータって何なの??」

「初心者でも理解できるだろうか?」

「しっかりと仕組みを理解して使いこなせるようになりたい!」

というPython初心者の方へ向けての記事となります。

当記事を通じて、

  • デコレータとは何なのか?
  • 初心者がつまづいてしまう2つのポイント
  • 実例に基づいた仕組み・構造の解説

を解説していきます。

profile_icon

【Python歴】10年 x 【営業マン歴】11年

HP作成、社内システムの構築、コンサルティング

Pythonベースのフレームワーク 「Django」を使って下記のようなサイトを作っています!

日報アプリ
当ブログで一から開発方法を解説している日報アプリ(デモ版)です
ツールアプリ
当ブログで紹介したPythonアプリのWeb版です。DjangoAPIとReactで開発。随時更新中です。

初期費用ゼロ/月9,800円でWebデザインが学べる

デザインを習得するためには、客観的なフィードバックと改善が不可欠です。

以下の記事ではこんなWebデザインスクールをご紹介しています。

  • 初期費用ゼロで、月々9,800円のみ
  • オンラインで、教材が使い放題
  • コンテストや実務案件にチャレンジして報酬もGETできる

デザナルはトップデザイナーからレビューがもらえる、格安のWebデザインスクールです。

>>デザナルに興味がある方はこちらからどうぞ<<

詳細をまとめた記事もございますので、ぜひご覧ください。

デコレータとは?

デコレータを英語表記にすると「decorator」です

動詞「decorate」が由来で、意味は「飾る」、「塗る」となります

Pythonでのデコレータは、特殊な関数のことをさしますので、関数を飾る関数と言えるでしょう

デコレータ関数が飾られた関数は、デコレータ関数の能力を使うことができます

  • 漫画「ワンピース」で言えば、デコレータは悪魔の実、
  • ゲーム「マイクラ」で言えば、デコレータはエンチャント

本来の関数の力に、デコレート関数の能力が付与されます

とは言っても、それでもPython初学者の方には「やっぱりデコレータはわかりにくい!」とつまづくポイントがありますので、しっかりと理解を深めてつまづいてもすぐ起きれるよう次章でポイントを解説します

初心者がつまづくポイントは2つ

typing

【ポイント①】どんな時に使うのかがわからない

複数の関数で、共通して使いたい機能がある時

がデコレータ関数を使うときです

例えば、

  • ログ機能として、関数を実行した時の時間を記録しておく
  • 関数を実行した時のスピードを測る

など、プログラム開発において「この機能はあの関数にもこの関数にも必要!」と思えるものがある時はデコレータを定義し使うときです

【ポイント②】どうやって書くのかがわからない

次章で実例もご紹介しますが、言葉でポイントをまとめると下記の通りです

  1. デコレータ関数には引数で関数を渡す
  2. デコレータ関数の中にもう一つ関数を記述する(inner_funcとします)
  3. inner_func内で、引数で受け取った関数を実行する
  4. デコレータ関数でinner_funcを返す
def deco(func): #引数で関数を受け取る
    def inner_func(*args, **kwargs): #関数の中に関数を書く
        func(*args, **kwargs) #中の関数で引数で受け取った関数を実行
return inner_func #中の関数を返す

なんとなくで良いので全体像がつかめたでしょうか?

具体的にコードを書いてみましょう!

実例を使って構造を深掘りしよう!

実行時間をprintするデコレータを作りました

def time_keeper(func):
    from datetime import datetime
    def wrapper(*args, **kwargs):
        now = datetime.now()
        print(now)
        func(*args, **kwargs)
    return wrapper

「reminder」という関数をtime_keeperでデコレートしてみます

@time_keeper
def reminder(todo):
    print(f"{todo}の時間です")

実行してみると、

reminder("おやつ")
2021-12-21 10:53:52.183154
おやつの時間です

別の値で試しても、

reminder("勉強")
2021-12-21 10:54:03.821581
勉強の時間です

きちんと時間がprintされました!

今度は別の関数で起床のお知らせです

@time_keeper
def loggin_wakeup():
    print("起床時間を記録しました")

実行してみると、

loggin_wakeup()
2021-12-21 10:55:50.710904
起床時間を記録しました

同じように時間が記録されました!

まとめ

デコレータとは、

  • 関数に新たな能力を付与する関数です
  • ログ機能など、複数の関数で使いたい機能を定義します
  • デコレータ関数内に関数を定義し、デコレータはその中の関数を返すよう記述します

上手に活用することで、よりパイソニスタらしい記述ができるようになります

もし、「忘れちゃった!」「どうやるんだっけ?」となったときはいつでもこちらまで戻ってきてください!

Pythonでホームページが作れるのをご存知でしょうか?

当ブログでは、PythonをベースとしたDjangoフレームワークを使って一からホームページを作成、公開するまでを解説しているブログになります

最終的には、下記リンク先のような日報アプリを開発、公開できるように進めていきます

https://nippo.itc-app.site/
ようこそ!簡易日報アプリ「D-Repo」へ!こちらは無料で使える日報アプリのデモサイトになります!「Webアプリはとてもカンタンで便利!」を感じてみよう!

興味のある方はシリーズの記事が一覧となっている↓のページをご覧ください

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!
タイトルとURLをコピーしました