🍌
【Python/Django】のデコレータを基礎から理解する
チョコバナナをデコレートしている
あのカラフルな粒々が好きです。
こんにちは、
ワニかず@40歳 出戻りエンジニアです。
ということで、今回は
- Pythonのデコレータについての説明と簡単な例、
- さらに、Djangoでの使用例とその意味
について解説したいと思います。
デコレータの基礎を覚えたところ、
Djangoに応用したとたん、全く理解できなかったので、
まとめてみました。
簡単な具体例
デコレータとデコレートされる関数を明確に分けて説明します。
# ここがデコレータ
def show_message(func): # ← デコレータ関数の定義
def wrapper():
print("関数を実行します")
func()
print("関数の実行が終わりました")
return wrapper
# ここがデコレートされる関数
@show_message # ← デコレータを適用
def hello(): # ← デコレートされる関数
print("Hello, World!")
-
デコレータ:
-
show_message
関数とその中のwrapper
関数 - 他の関数を受け取って機能を拡張する役割
-
-
デコレートされる関数:
-
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」は説明の簡略化のために
いったん無視して解説します。
まず、
-
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()
という部分ですが、
- これはデータベースのテーブル構造を定義
-
title
、start_date
、end_date
という3つのフィールドを持つテーブルが作られる
-
CalendarEventAdmin
クラス
admin.py
@admin.register(CalendarEvent)
class CalendarEventAdmin(admin.ModelAdmin):
-
CalendarEventAdmin
クラスは、admin.ModelAdmin
クラスを継承しており -
admin.ModelAdmin
クラスを継承することで、管理画面の基本機能が使える - また、それらの機能をカスタマイズできるようになっている
さらに、
-
CalendarEventAdmin
クラスは、@admin.register(CalendarEvent)
によってデコレートされている - デコレータの
@admin.register(CalendarEvent)
は、Djangoの管理画面にCalendarEventを登録している - そのため、データベーステーブルの「
title
、start_date
、end_date
」を、Djangoの管理画面で更新できるデコレータとなっている - このような状態のデコレータで
CalendarEventAdmin
クラスはデコレートされている
ということになります。
そして、
admin.py
list_display = ('title', 'start_date', 'end_date')
となっていることで、
-
list_display
で「この3つのフィールドを管理画面に一覧表示する」と指定しています
つまり:
-
CalendarEvent
: データの構造を定義(「何を」保存するか) -
CalendarEventAdmin
: 管理画面での表示方法を定義(「どのように」表示するか)
という役割分担で、それらを結び付けている、ということになります。
おしまいに
今回はPythonのデコレータと
Djangoでの使用例をまとめてみました。
デコレートされている部分を日本語にすると
とんでもない文字数になるところ、
Pythonのコードだとすっきりしていて、
便利な記述の仕方だと思いました。
ということで、
誰か、私の頭をITの知識でデコレートしてください(切実)
最後までご覧いただき、ありがとうございました!
Discussion