【Python】dataclassでデータクラスを実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

Pythonのdataclassでデータクラスを実装する方法を知りたい」とお考えではありませんか?

属性を並べただけのクラスに__init__や__repr__を毎回手書きするのが面倒だと感じている方へ。

標準ライブラリのdataclassesモジュールを使えば、デコレータ1つで定型メソッドを自動生成できます

いずみ

ベリーイージーなのでサクッと解説します。

ということで、本記事ではPythonのdataclassでデータクラスを実装する方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【Python】dataclassでデータクラスを実装する方法

早速ですが、Pythonのdataclassでデータクラスを実装する方法を解説します。

dataclassとは何か

dataclassは、データを保持するためのクラスを短く書けるようにする標準ライブラリの機能です。

通常のクラスでは__init__や__repr__、__eq__を手書きする必要があります。

@dataclassデコレータを付けるだけで、Pythonが必要なメソッドを自動生成してくれます。

標準ライブラリのdataclassesモジュールに含まれているため、追加インストールは不要です。

いずみ

属性を並べるだけのクラスを何個も書いていると、__init__の記述が本当に面倒なんですよね。

基本的な書き方

まずは最小限のdataclassを定義してみます。

from dataclasses import dataclass


@dataclass
class Book:
    title: str
    price: int
    author: str = "unknown"

クラス変数に型アノテーションを付けて並べるだけで定義できます。

各フィールドにデフォルト値を指定することも可能です。

定義したBookクラスは次のように使います。

book = Book(title="Python入門", price=2800)
print(book)
# Book(title='Python入門', price=2800, author='unknown')

print(book == Book(title="Python入門", price=2800))
# True

__init__を書いていないのに、キーワード引数でインスタンスを生成できます。

printで中身が読みやすく表示されるのは、__repr__が自動生成されているからです。

フィールドの値が等しいdataclass同士は、==で等価と判定されます。

いずみ

通常のクラスだと == はデフォルトでidベースの比較になるので、値で比較したいときにdataclassが効いてきます。

fieldでミュータブルなデフォルト値を扱う

リストや辞書をデフォルト値にしたい場合、そのまま書くとValueErrorになります。

全インスタンスで1つのオブジェクトを共有してしまう不具合を防ぐための仕様です。

field関数のdefault_factoryを使うと、インスタンスごとに新しいオブジェクトを生成できます。

from dataclasses import dataclass, field


@dataclass
class Cart:
    items: list[str] = field(default_factory=list)
    meta: dict[str, str] = field(default_factory=dict)

default_factoryには、初期値を作る呼び出し可能オブジェクトを渡します。

listやdictのほか、ラムダ式で任意の初期値を返すこともできます。

よく使うオプション

@dataclassには挙動を切り替える引数がいくつか用意されています。

STEP
frozenでイミュータブルにする

@dataclass(frozen=True)を指定すると、生成後にフィールドを書き換えられなくなります。

値を変更しようとするとFrozenInstanceErrorが送出されます。

frozen=Trueのdataclassは自動的にハッシュ可能になり、辞書のキーや集合の要素として使えます。

@dataclass(frozen=True)
class Point:
    x: int
    y: int
STEP
slotsでメモリを節約する

Python 3.10以降では@dataclass(slots=True)が使えます。

__dict__の代わりに固定の属性領域を持つため、メモリ使用量が減り属性アクセスも速くなります。

大量のインスタンスを生成する場面で効果が出ます。

STEP
kw_onlyで引数の渡し間違いを防ぐ

@dataclass(kw_only=True)を指定すると、全フィールドがキーワード引数専用になります。

位置引数で順番を間違えるミスを防げます。

いずみ

slots=TrueはPython 3.10以降が前提なので、動かす環境のバージョンだけ確認しておいてください。

__post_init__でバリデーションを書く

生成時に値の検証や補正を行いたい場合、__post_init__メソッドを定義します。

__post_init__は、自動生成された__init__が全フィールドを設定し終えた後に呼び出されます。

複数フィールドをまたいだチェックを書く場所として向いています。

from dataclasses import dataclass


@dataclass
class DateRange:
    start: int
    end: int

    def __post_init__(self):
        if self.start > self.end:
            raise ValueError("startはend以下にしてください")

frozen=Trueと併用する場合、__post_init__内での代入はobject.__setattr__を使います。

通常の代入はfrozenによって禁止されているためです。

from dataclasses import dataclass


@dataclass(frozen=True)
class Temperature:
    celsius: float

    def __post_init__(self):
        object.__setattr__(self, "celsius", round(self.celsius, 2))

dataclassが向いている場面

APIレスポンスや設定値など、構造の決まったデータの受け渡しに向いています。

辞書で持ち回すよりも、型アノテーションとエディタ補完の恩恵を受けられます。

asdict関数を使うと、dataclassのインスタンスを辞書へ変換できます。

from dataclasses import dataclass, asdict


@dataclass
class User:
    id: int
    name: str


print(asdict(User(id=1, name="izumi")))
# {'id': 1, 'name': 'izumi'}
いずみ

厳密な型チェックやスキーマ検証まで欲しいならPydantic、標準ライブラリだけで完結させたいならdataclass、と僕は使い分けています。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

dataclassと通常のクラスはどちらを使うべきですか?

データの保持が主目的ならdataclassが簡潔です。

複雑なロジックや多数のメソッドを持つ場合は、通常のクラスが向いています。

dataclassとPydanticの違いは何ですか?

dataclassは標準ライブラリで、実行時の型チェックは行いません。

Pydanticは外部ライブラリで、入力値の型変換やバリデーションを自動で行います。

外部入力の検証が必要な場面ではPydanticが適しています。

NamedTupleとdataclassはどう違いますか?

NamedTupleはタプルベースでイミュータブルです。

dataclassはミュータブルにもイミュータブルにもでき、__post_init__や継承など拡張の自由度が高いです。

slots=Trueを使うときの注意点はありますか?

Python 3.10以降が必要になります。

デフォルト値を持つフィールドと、既存クラスからの継承を組み合わせる場合に制約が出ることがあります。

まとめ

今回は、Pythonのdataclassでデータクラスを実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • @dataclassを付けるだけで__init__・__repr__・__eq__が自動生成される。
  • リストや辞書のデフォルト値はfield(default_factory=…)で指定する。
  • frozen・slots・kw_onlyで用途に応じた挙動を選べる。
  • 生成時の検証は__post_init__に書く。
まとめ
  • おすすめ本
¥2,970 (2023/07/25 22:48時点 | Amazon調べ)

Pythonの勉強なら「」が体系的に学べるのでおすすめですよ♪

いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次