L07 ch01 — dataclass
テクノロジ系 / L07 class — クラスとデータ構造
L07 ch01 — dataclass
データ保持専用クラスを最小コードで定義する
ゴール
@dataclassでデータクラスを定義- 型ヒント駆動の値オブジェクト
- frozen=True で immutable に
通常のクラス (冗長)
class Task:
def __init__(self, id: int, title: str, done: bool = False):
self.id = id
self.title = title
self.done = done
def __repr__(self):
return f"Task(id={self.id}, title={self.title!r})"@dataclass で簡潔に
from dataclasses import dataclass
@dataclass
class Task:
id: int
title: str
done: bool = False
t = Task(id=1, title="買い物")
print(t) # Task(id=1, title='買い物', done=False)__init__ / __repr__ / __eq__ を自動生成。
frozen で immutable
@dataclass(frozen=True)
class Task:
id: int
title: str
t = Task(id=1, title="掃除")
t.title = "変更" # → FrozenInstanceError→ Value Object 設計に最適
mutable default の罠
# ❌ 危険
@dataclass
class Cart:
items: list = [] # → エラー (PEP)
# ✅ 正しい
from dataclasses import field
@dataclass
class Cart:
items: list = field(default_factory=list)比較も自動
t1 = Task(id=1, title="a") t2 = Task(id=1, title="a") t1 == t2 # True (自動 __eq__)
通常クラスならインスタンス比較で False。
dataclass の用途
- DTO (Data Transfer Object)
- API レスポンスの構造化
- 設定オブジェクト
- イベント / ドメインモデル
→ 業務で大量に使う
drill
drill/ — Task dataclass の定義
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。