いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「Pythonのdataclassでデータクラスを実装する方法を知りたい」とお考えではありませんか?
属性を並べただけのクラスに__init__や__repr__を毎回手書きするのが面倒だと感じている方へ。
標準ライブラリのdataclassesモジュールを使えば、デコレータ1つで定型メソッドを自動生成できます。



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



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【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には挙動を切り替える引数がいくつか用意されています。
@dataclass(frozen=True)を指定すると、生成後にフィールドを書き換えられなくなります。
値を変更しようとするとFrozenInstanceErrorが送出されます。
frozen=Trueのdataclassは自動的にハッシュ可能になり、辞書のキーや集合の要素として使えます。
@dataclass(frozen=True)
class Point:
x: int
y: intPython 3.10以降では@dataclass(slots=True)が使えます。
__dict__の代わりに固定の属性領域を持つため、メモリ使用量が減り属性アクセスも速くなります。
大量のインスタンスを生成する場面で効果が出ます。
@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つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- 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でデータクラスを実装する方法について解説しました。
以下が本記事のまとめになります。
- おすすめ本
Pythonの勉強なら「独習Python



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。









