1.order=True(大小比較ができるようになる)
order=True を付けると、
dataclass の値を元に <, >, <=, >= が使えるようになります。
ただし 比較対象はクラスに定義したフィールドの順序に従う。
✔ 例:年齢の小さい順に比較
from dataclasses import dataclass
@dataclass(order=True)
class Person:
age: int
name: str
people = [
Person(30, "C"),
Person(20, "A"),
Person(25, "B")]
sorted_people = sorted(people)
結果:年齢順にソートされる
→ 「値オブジェクト」「ランキング」「順番つきデータ」 に便利!
✔ 例:特定のフィールドだけ比較対象にしたい場合
compare=False を使うと比較対象から除外される。
@dataclass(order=True)
class Item:
price: int
name: str = field(compare=False)
→ 比較は price のみで行われる。
2.slots=True(高速・省メモリ・安全)
slots=True を付けると、クラスのインスタンスに __slots__ を自動設定してくれる。
- メモリ使用量が減る(インスタンス辞書が省かれる)
- アクセスが高速になる
- 定義していない属性を勝手に追加できなくなる(バグ防止)
from dataclasses import dataclass
@dataclass(slots=True)
class User:
id: int
name: str
#勝手に属性を追加しようとするとエラー:
u = User(1, "Alice")
u.age = 20 # エラー:slots にない属性は追加できない
型が決まっているデータ構造では slots=True を付けるのが推奨
(大量データ処理・高速化にも有効)
3.frozen=True(不変データクラス)
- インスタンスを 変更不可(イミュータブル)にする
- 安全性が高く、設定値・ID などに最適
@dataclass(frozen=True)
class Config:
host: str
port: int
cfg = Config("localhost", 8080)
cfg.port = 9000 # エラー
4.kw_only=True(キーワード引数専用にする)
Python 3.10 以降で追加された便利オプション。ちゃんと定義名を指定して代入しないとエラーになる。
@dataclass(kw_only=True)
class User:
id: int
name: str
User(1, "Alice") # エラー
User(id=1, name="Alice") # OK
引数間違いを防げる
大規模コードで便利
5.オプション一覧(実務で使うものだけ厳選)
| オプション | 説明 | よく使う場面 |
| order=True | 比較演算子をサポート | ソート・順位付け |
| slots=True | 高速化・省メモリ・属性追加禁止 | 大量データ処理、APIレスポンス |
| frozen=True | 不変オブジェクト化 | 設定・ID・安全な値オブジェクト |
| kw_only=True | キーワード必須 | 大規模開発での安全性向上 |
| eq=False | == 比較を無効化 | 特殊ケースのみ |
| unsafe_hash=True | hash を強制生成 | set・dictキーに使いたい時 |
6.実例:高品質データモデルの作成
以下は実践でよく使うパターン:
from dataclasses import dataclass, field
@dataclass( order = True , slots = True , frozen = True )
class Product:
price: int
name: str = field(compare=False)
特徴:
- order=True → price で比較・ソートできる
- slots=True → 高速 & 省メモリ
- frozen=True → 変更不可(安全)
- compare=False → name は比較対象外
7.まとめ
- order=True → <, > 比較やソートが可能
- slots=True → 高速&メモリ節約&属性追加禁止
- frozen=True → 値を変更不可(安全)
- kw_only=True → 引数ミスの防止
- dataclass はオプションを組み合わせると「高品質なデータモデル」になる
