@dataclass: ボイラープレート削減

__init__, __repr__, __eq__ を自動生成。Python 3.7+の必須機能。

dataclass
データ保持クラスを簡潔に定義。
frozen
イミュータブル(変更不可)にする。
field
デフォルト値やファクトリを指定。

dataclassとは?

自動入力フォーム (Auto-filled Form)

dataclass は「役所の自動入力フォーム」です。普通のクラス定義では、毎回手書きで「氏名、住所、年齢...」と何度も同じ変数を書く必要があります(__init__など)。しかし dataclass を使えば、項目名を書くだけで、残りの面倒な手続き書類(__init__, __repr__など)を全て自動で作成・提出してくれます。

Python 3.7 で導入された、データ保持用のクラスを簡単に作るための機能です。ボイラープレート(決まりきったコード)を劇的に削減できるため、データの入れ物としてクラスを使う場合はほぼ必須の機能です。

Basic dataclass
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
email: str = "" # デフォルト値
# 自動生成: __init__, __repr__, __eq__
user = User("Alice", 30)
print(user) # User(name='Alice', age=30, email='')
# 比較も自動
user1 = User("Bob", 25)
user2 = User("Bob", 25)
print(user1 == user2) # True
Bad
# ❌ Bad: ボイラープレート多い
class User:
def __init__(self, name, age, email=""):
self.name = name
self.age = age
self.email = email
def __repr__(self):
return f"User({self.name}, {self.age})"
def __eq__(self, other):
return (self.name == other.name and
self.age == other.age)
Good
# ✅ Good: dataclass で簡潔
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
email: str = ""

高度な機能

frozen, field, slots
from dataclasses import dataclass, field
@dataclass(frozen=True) # イミュータブル
class Point:
x: float
y: float
@dataclass
class Order:
id: int
items: list = field(default_factory=list) # ミュータブルデフォルト
# 後処理
def __post_init__(self):
if self.id < 0:
raise ValueError("ID must be positive")
# slots で省メモリ (Python 3.10+)
@dataclass(slots=True)
class CompactUser:
name: str
age: int
Tip: ミュータブルなデフォルト値は field(default_factory=list) を使う。

合格ライン

@dataclass を使える
frozen と field を知っている

演習課題

課題1: @dataclass
@dataclass でユーザークラスを作成してください。
課題2: frozen
frozen=True で不変なデータクラスを作成してください。