メインコンテンツへスキップ

dataclass

🐍 はじめに

Pythonでは、ちょっとしたデータ構造(名前と年齢など)を表現するクラスを作るだけでも、意外と多くのコードが必要になります。そんな煩わしさを一気に解消してくれるのが、dataclassです。

このページでは、dataclassを使わない場合と使った場合のコードを比較しながら、何を“やらずに済む”のか、つまり dataclass の「嬉しさ」にフォーカスして解説していきます!


✍️ 通常のクラス定義(dataclassなし)

まずは、nameage を持つユーザークラスを普通に書いてみます。

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'User(name={self.name!r}, age={self.age})'

    def __eq__(self, other):
        if not isinstance(other, User):
            return False
        return self.name == other.name and self.age == other.age

このように、たった2つの属性でも3つのメソッドを自力で書く必要があります。


dataclassを使うと…

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

たったこれだけで、以下が自動生成されます!

  • __init__(初期化)

  • __repr__(表示用文字列)

  • __eq__(等価性の比較)

  • (オプションで)__lt__ などの比較演算

  • (オプションで)__hash__ などのハッシュ関数


⚖️ 実際の動作を見てみよう!

u1 = User(name="Alice", age=30)
u2 = User(name="Alice", age=30)

print(u1)           # User(name='Alice', age=30)
print(u1 == u2)     # True

通常のクラスではこうした挙動を実現するためにメソッドをいちいち定義する必要がありますが、dataclassなら何も書かなくても動くのが嬉しいポイント!


☑️ dataclassの「やらなくていいこと」まとめ

やりたいこと 通常のクラス dataclassなら?
初期化 __init__を書く 自動生成
表示 __repr__を書く 自動生成
比較 __eq__を書く 自動生成
不変オブジェクトにしたい 属性をロックする工夫が必要 frozen=True をつけるだけ
順序比較 __lt__, __gt__などを書く order=True をつけるだけ
IDE補完 自由だが弱め 型ヒント必須で補完強力

⭐ まとめ:dataclassはPythonの定番魔法!

dataclassは、いわば「データ構造専用の軽量クラス自動生成マシン」です。
定義をシンプルにして、比較、表示、初期化などのコードを勝手に作ってくれるので、

  • デバッグが楽になる

  • テストが書きやすくなる

  • クラス定義にかかる時間を節約できる

という嬉しいメリットだらけです!

もしあなたが「ただのデータの入れ物」を定義したいなら、迷わず@dataclassを使いましょう!