Python|データクラス(dataclass)と通常のクラスの違いと使い分け

1. はじめに

Pythonでは、データを格納するためのクラスを簡単に定義できる「データクラス(@dataclass)」という機能があります。
通常のクラスに比べて記述が簡潔になり、可読性や保守性も向上します。
本記事では、Python|データクラス(dataclass)と通常のクラスの違いと使い分けというテーマで、両者の特徴や使い分け方を初心者にもわかりやすく解説します。

記事を読み終える頃には、「どんなときに通常のクラスを使うべきか」「データクラスを使うとどんなメリットがあるのか」を明確に理解できるようになります。

 

2. Pythonの通常のクラスとデータクラスの基本解説

2-1. 通常のクラスとは?

通常のクラス(カスタムクラス)は、属性やメソッドを自由に定義できる柔軟性の高い構文です。
データだけでなく振る舞い(メソッド)も含めた構造を作るのに適しています。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"こんにちは、{self.name}です。{self.age}歳です。"

p = Person("太郎", 30)
print(p.greet())

実行結果:

こんにちは、太郎です。30歳です。

2-2. データクラス(@dataclass)とは?

@dataclassは、Python 3.7から導入された機能で、データを格納するためのクラスを簡潔に記述できます。
__init____repr____eq__といったメソッドを自動生成してくれるため、ボイラープレート(定型)コードを大幅に削減できます。

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

p = Person("太郎", 30)
print(p)

実行結果:

Person(name='太郎', age=30)

このように、わずか数行でクラスの定義が完了し、属性の確認も見やすく出力されます。

 

3. よくある使い方・応用例

3-1. データの比較に使う

データクラスでは__eq__が自動実装されるため、オブジェクトの比較が容易です。

from dataclasses import dataclass

@dataclass
class Item:
    name: str
    price: int

item1 = Item("ノート", 200)
item2 = Item("ノート", 200)

print(item1 == item2)

実行結果:

True

通常のクラスで同様の比較を行うには、__eq__メソッドを自分で定義する必要があります。

3-2. デフォルト値やフィールド制御も簡単

データクラスでは、field()を使ってより柔軟な定義も可能です。

from dataclasses import dataclass, field

@dataclass
class Product:
    name: str
    stock: int = 0
    tags: list = field(default_factory=list)

product = Product("りんご")
print(product)

実行結果:

Product(name='りんご', stock=0, tags=[])

default_factoryを使うことで、リストや辞書などのミュータブルな初期値も安全に扱えます。

 

4. 注意点・エラー対策

4-1. メソッドを多用する場合は通常クラスを選ぶ

データクラスは主にデータ構造として使うのが適しており、振る舞い(メソッド)をたくさん持たせる場合は通常のクラスの方が適切です。

4-2. ミュータブルなデフォルト値の落とし穴

通常のクラスでもよくある失敗ですが、デフォルト引数に[]{}を使うと、全インスタンスで共有されてしまうため注意が必要です。
データクラスではfield(default_factory=list)のように安全な方法が用意されています。

4-3. Python 3.6以前では使えない

@dataclassPython 3.7以降の機能です。
それ以前のバージョンではdataclassesモジュール自体が存在しないため注意しましょう。

 

5. まとめ

今回は「Python|データクラス(dataclass)と通常のクラスの違いと使い分け」というテーマで、両者の特徴を比較しながら解説しました。

  • 通常のクラス:柔軟でメソッド定義に適している
  • データクラス:属性中心のクラスに便利、記述が簡潔
  • 比較や表示、初期化が自動化されるという大きなメリットあり

実務でも、例えばAPIから受け取ったJSONデータを構造化して扱うときなど、データクラスは非常に重宝されます。
データを主とするクラスなら、まずはデータクラスで定義できるか検討してみるとよいでしょう。

学習のコツ:まずは簡単な通常クラスを書いた後、それをデータクラスに書き換えてみることで、違いがより実感できます。

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