Zenn
🍌

【Python/Django】のデコレータを基礎から理解する

2025/02/05に公開

チョコバナナをデコレートしている
あのカラフルな粒々が好きです。

こんにちは、
ワニかず@40歳 出戻りエンジニアです。

ということで、今回は

  • Pythonのデコレータについての説明と簡単な例、
  • さらに、Djangoでの使用例とその意味
    について解説したいと思います。

デコレータの基礎を覚えたところ、
Djangoに応用したとたん、全く理解できなかったので、
まとめてみました。

簡単な具体例

デコレータとデコレートされる関数を明確に分けて説明します。

# ここがデコレータ
def show_message(func):            # ← デコレータ関数の定義
    def wrapper():
        print("関数を実行します")
        func()
        print("関数の実行が終わりました")
    return wrapper

# ここがデコレートされる関数
@show_message                      # ← デコレータを適用
def hello():                      # ← デコレートされる関数
    print("Hello, World!")
  1. デコレータ:

    • show_message関数とその中のwrapper関数
    • 他の関数を受け取って機能を拡張する役割
  2. デコレートされる関数:

    • hello関数
    • 基本となる処理を持つ関数
    • デコレータによって機能が拡張される

@show_messageという記法は、以下のコードと同じ意味です。

def hello():
    print("Hello, World!")
hello = show_message(hello)  # 手動でデコレータを適用

つまり、hello関数がshow_messageデコレータによって拡張され、実行時には前後に追加のメッセージが表示されるようになります。

Djangoの具体例

カレンダーに予定を追加するDjangoの管理画面を想定した
以下のソースを例にお話しします。

admin.py
from django.contrib import admin
from .models import CalendarEvent

@admin.register(CalendarEvent)
class CalendarEventAdmin(admin.ModelAdmin):
    list_display = ('title', 'start_date', 'end_date')
models.py
from django.db import models

class CalendarEvent(models.Model):
    title = models.CharField(max_length=200)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

簡単な例は理解できたのに、
少し複雑になるだけで理解ができなくなることってありますよね(私のこと)

ということです少しでもイメージしやすくなるよう、
実際の管理画面の画像を以下に示します。

「Description」は説明の簡略化のために
いったん無視して解説します。

まず、

  1. CalendarEventクラス
models.py
class CalendarEvent(models.Model):

の部分は、

  • CalendarEventクラスはmodels.Modelクラスを継承したクラスで
  • models.Modelを継承することで、Djangoのデータベース操作に関する様々な機能を利用できる

次に、

models.py
    title = models.CharField(max_length=200)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

という部分ですが、

  • これはデータベースのテーブル構造を定義
  • titlestart_dateend_date という3つのフィールドを持つテーブルが作られる
  1. CalendarEventAdminクラス
admin.py
@admin.register(CalendarEvent)
class CalendarEventAdmin(admin.ModelAdmin):
  • CalendarEventAdminクラスは、admin.ModelAdminクラスを継承しており
  • admin.ModelAdminクラスを継承することで、管理画面の基本機能が使える
  • また、それらの機能をカスタマイズできるようになっている

さらに、

  • CalendarEventAdminクラスは、@admin.register(CalendarEvent)によってデコレートされている
  • デコレータの@admin.register(CalendarEvent)は、Djangoの管理画面にCalendarEventを登録している
  • そのため、データベーステーブルの「titlestart_dateend_date 」を、Djangoの管理画面で更新できるデコレータとなっている
  • このような状態のデコレータでCalendarEventAdminクラスはデコレートされている

ということになります。
そして、

admin.py
    list_display = ('title', 'start_date', 'end_date')

となっていることで、

  • list_display で「この3つのフィールドを管理画面に一覧表示する」と指定しています

つまり:

  • CalendarEvent: データの構造を定義(「何を」保存するか)
  • CalendarEventAdmin: 管理画面での表示方法を定義(「どのように」表示するか)
    という役割分担で、それらを結び付けている、ということになります。

おしまいに

今回はPythonのデコレータと
Djangoでの使用例をまとめてみました。

デコレートされている部分を日本語にすると
とんでもない文字数になるところ、
Pythonのコードだとすっきりしていて、
便利な記述の仕方だと思いました。

ということで、
誰か、私の頭をITの知識でデコレートしてください(切実)
最後までご覧いただき、ありがとうございました!

Discussion

ログインするとコメントできます