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
を使いましょう!