【Python】dataclasses入門

Python
この記事は約7分で読めます。

こんにちは、JS2IIUです。
データ構造を定義するためにクラスを使っている場面がありますが、今回は標準ライブラリの’dataclasses’を使って一歩進んだデータ管理についてみていきます。コードの中で@dataclassと書かれているのを見かけたことありませんか?今回もよろしくお願いします。

1. はじめに

Pythonには、データを管理するためのクラスを簡単に作成できるdataclassesという標準ライブラリがあります。本記事では、dataclassesの基本的な使い方を、できるだけ分かりやすく解説します。

この記事を読むと分かること

  • dataclassを使ってクラスを簡単に定義する方法
  • クラスのインスタンスを作成する方法
  • 自動生成されるメソッドの種類
  • field を使った詳細なフィールド設定方法
  • dataclassesを使うべき場面とそうでない場面

2. dataclass の基本

まず、通常のPythonクラスを使ってデータを管理する方法を見てみましょう。

2.1 通常のクラスでのデータ管理

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

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

user = User("Alice", 30)
print(user)  # 出力: User(name='Alice', age=30)

このように、通常のクラスでは __init__ メソッドを定義して初期化し、__repr__ メソッドを定義してオブジェクトを文字列で表現します。

しかし、dataclass を使うと、これらのコードを簡潔に書くことができます。

2.2 dataclass を使ったクラス定義

Python
from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

user = User("Alice", 30)
print(user)  # 出力: User(name='Alice', age=30)

2.3 dataclass のメリット

  • __init__ メソッドを自動生成 → 手動で書く必要なし
  • __repr__ メソッドも自動生成 → print(user) で分かりやすい表記
  • eq=True デフォルトで比較可能 → user1 == user2 が動作する

3. フィールドの初期値とデフォルト値

クラスのフィールドにデフォルト値を設定できます。

3.1 デフォルト値の設定

Python
@dataclass
class User:
    name: str
    age: int = 20  # デフォルト値を指定

user1 = User("Alice")
print(user1)  # 出力: User(name='Alice', age=20)

age にデフォルト値を設定することで、省略時に 20 となります。

3.2 field(default=...) の利用

field を使うと、より柔軟なデフォルト値設定が可能です。

Python
from dataclasses import field

@dataclass
class User:
    name: str
    age: int = field(default=25)

user1 = User("Bob")
print(user1)  # 出力: User(name='Bob', age=25)

4. 比較メソッドの自動生成

デフォルトで dataclass__eq__ を自動生成します。

Python
@dataclass
class User:
    name: str
    age: int

user1 = User("Alice", 30)
user2 = User("Alice", 30)
print(user1 == user2)  # 出力: True

__eq__ メソッドが自動生成されるため、インスタンスを比較できます。

4.1 ソート可能にする (order=True)

Python
@dataclass(order=True)
class User:
    name: str
    age: int

user1 = User("Alice", 25)
user2 = User("Bob", 30)
print(user1 < user2)  # 出力: True(年齢で比較)

5. ミュータブルなデフォルト値の注意点

リストなどのミュータブルなデフォルト値を設定すると、意図しない動作を引き起こすことがあります。

5.1 間違った例

Python
@dataclass
class Team:
    members: list[str] = []  # 危険!

この場合、全ての Team インスタンスが 同じリスト を共有してしまいます。

5.2 field(default_factory=...) を使った正しい方法

Python
@dataclass
class Team:
    members: list[str] = field(default_factory=list)

default_factory=list を指定すると、新しいインスタンスごとに別のリストが作成されます。

6. dataclass を使うべきケース・使わない方がいいケース

6.1 dataclass を使うべきケース

  • データをシンプルに管理したいとき
  • JSONやデータベースとのやり取りに利用するとき
  • 比較メソッドを簡単に実装したいとき

6.2 dataclass を使わない方がいいケース

  • メソッドを多数持つクラス(通常のクラスのほうが適切)
  • __init__ を大幅にカスタマイズする必要がある場合

7. まとめ

  • dataclass を使うと、__init__, __repr__, __eq__ などを自動生成できる
  • field(default=...)field(default_factory=...) で詳細なフィールド設定が可能
  • order=True を指定すると、比較演算子 (<, >, <=, >=) が使える
  • ミュータブルなデフォルト値には注意し、default_factory を使う

dataclasses を活用すると、よりシンプルにデータ管理ができるようになります。ぜひ活用してみてください!

参考

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました