【Python入門】dataclass②

Python

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=Truehash を強制生成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 はオプションを組み合わせると「高品質なデータモデル」になる
タイトルとURLをコピーしました