dataclass
🐍 はじめに
Pythonでは、ちょっとしたデータ構造(名前と年齢など)を表現するクラスを作るだけでも、意外と多くのコードが必要になります。そんな煩わしさを一気に解消してくれるのが、dataclassです。
このページでは、dataclassを使わない場合と使った場合のコードを比較しながら、何を“やらずに済む”のか、つまり dataclass の「嬉しさ」にフォーカスして解説していきます!
✍️ 通常のクラス定義(dataclassなし)
まずは、name と age を持つユーザークラスを普通に書いてみます。
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を使いましょう!