用語比較
dataclassと通常のクラスの違い|データをまとめるクラスの書き方をPython3エンジニア認定基礎試験で判断する
dataclassは、名前付きのデータ項目をまとめるクラスを短く書くための仕組みです。通常のクラスは、データ項目を持たせるために __init__ を自分で書きます。公式チュートリアル9.7は、PascalのレコードやC言語の構造体のように名前付きのデータ項目をまとめる型には、Pythonでは dataclasses を使うのが一般的だと述べています。
Python 3 エンジニア認定基礎試験では、@dataclass を付けたクラスに __init__ を書かなくてもインスタンスが作れるか、同じ値のインスタンスを == で比べた結果はどうなるかを選ぶ問題が想定されます。クラスの章(第9章)で、__init__ やインスタンス変数と一緒に確認します。
このページは、クラスは書けるが dataclass の違いが曖昧な人を対象にしています。書く量、print の表示、== の結果、型注釈の扱いという4つの軸で、公式チュートリアルの記載と Python 3.9.6 での実行結果を整理します。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
通常のクラス
データ項目を持たせるには __init__ を自分で書く。print は <__main__.… object at 0x…> の形で、同じ値の2つを == で比べると False になる。
dataclass
@dataclass を付けて name: str のように項目を並べると、__init__ を書かずにインスタンスを作れる。print は項目名と値を並べた形で、同じ値の2つを == で比べると True になる。
違いを表で確認
| 比較軸 | 通常のクラス | dataclass |
|---|---|---|
| インスタンスの作り方 | __init__ を自分で書き、self.name = name のように1項目ずつ代入する | @dataclass を付けて name: str のように項目を並べるだけで Employee('john', 'computer lab', 1000) と作れる |
| print の表示 | 自分で書かなければ <__main__.Plain2 object at 0x…> の形になる | Employee(name='john', dept='computer lab', salary=1000) のように項目名と値が並ぶ |
| 同じ値の2つを == で比べた結果 | 別のオブジェクトなので False | 項目の値が同じなので True |
| 型注釈の扱い | 型注釈は必須ではない | name: str のような注釈で項目を並べるが、salary に文字列を渡しても型の検査はされずそのまま入る |
| 選択肢で探すキーワード | __init__、self、インスタンス変数 | dataclasses、@dataclass、名前付きのデータ項目をまとめる |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
データを入れるだけのクラスでも __init__ を毎回書いている人
公式チュートリアル9.7は、名前付きのデータ項目をまとめる用途には dataclasses を使うのが一般的だと説明しています。項目名と型注釈を並べるだけで Employee('john', 'computer lab', 1000) と作れます。
dataclass の項目の型注釈が実行時に検査されると考える人
Python 3.9.6で salary: int の項目に 'not int' を渡しても、エラーにならずそのまま入ります。型注釈は項目を並べるための書き方で、型の検査をする仕組みではありません。
同じ値の2つのインスタンスは通常のクラスでも == で True になると考える人
__init__ だけを書いた通常のクラスでは、同じ値の2つを == で比べると False になります。dataclass では項目の値が同じなら True です。
問題文から答えを選ぶ手順
- 1
何のためのクラスかを確認する
名前付きのデータ項目をまとめるのが目的なら dataclass です。公式チュートリアル9.7がこの用途に dataclasses を使うのが一般的と説明しています。
- 2
__init__ を書いているかを確認する
@dataclass の下に項目を並べるだけなら、__init__ は書きません。通常のクラスなら __init__ が要ります。
- 3
print や == の結果を問われたら、どちらのクラスかを確認する
dataclass は項目名と値が並ぶ表示で、同じ値なら == が True です。通常のクラスは object at 0x… の表示で、== は False です。
- 4
項目の数を確認する
dataclass に Employee('x') のように項目より少ない値を渡すと、引数不足の TypeError になります。
試験での見分け方
- 1名前付きのデータ項目をまとめる用途には dataclasses を使うのが一般的(公式チュートリアル9.7)。
- 2@dataclass を付けたクラスは、項目を並べるだけで __init__ を書かずにインスタンスを作れる。
- 3dataclass は print で項目名と値が並び、同じ値の2つを == で比べると True になる。
- 4__init__ だけを書いた通常のクラスは、同じ値の2つを == で比べると False になる。
- 5dataclass の型注釈は、実行時に値の型を検査しない。
誤答しやすい選択肢
@dataclass を付けたクラスで __init__ も書かないとインスタンスを作れないと考える
修正: 公式チュートリアル9.7の Employee は __init__ を書いていませんが、Employee('john', 'computer lab', 1000) でインスタンスを作れます。
name: str と書けば str 以外はエラーになると考える
修正: Python 3.9.6で salary: int の項目に 'not int' を渡しても、エラーにならずそのまま入ります。
通常のクラスでも同じ値なら == が True になると考える
修正: Python 3.9.6で、__init__ で同じ値を持たせた2つの通常のクラスのインスタンスを == で比べると False でした。dataclass は True です。
項目の数が足りなくても dataclass なら補われると考える
修正: Python 3.9.6で Employee('x') と書くと、dept と salary が足りないという TypeError になります。
確認問題
Q1公式チュートリアル9.7が、名前付きのデータ項目をまとめる用途に使うのが一般的だと述べているものは?
答え: dataclasses
Pascalのレコードや C 言語の構造体のように名前付きのデータ項目をまとめる型には、Python では dataclasses を使うのが一般的だと説明されています。
Q2@dataclass を付けた class Employee に name: str・dept: str・salary: int を並べたとき、Employee('john', 'computer lab', 1000).salary は?
答え: 1000
公式チュートリアル9.7の例と同じです。__init__ を書かなくても、並べた順に値が項目に入ります。
Q3同じ値を持つ2つの Employee(dataclass)を == で比べた結果は?
答え: True
dataclass は項目の値が同じなら等しいとみなします。Python 3.9.6で True を確認しました。
Q4__init__ だけを書いた通常のクラスで、同じ値を持つ2つのインスタンスを == で比べた結果は?
答え: False
別々のオブジェクトなので False です。Python 3.9.6で確認しました。
到達チェック
- 名前付きのデータ項目をまとめるには dataclasses を使うのが一般的と言える
- @dataclass のクラスは __init__ を書かずにインスタンスを作れると説明できる
- dataclass は print が項目名と値の形で、同じ値なら == が True と言える
- 型注釈は実行時に値の型を検査しないと知っている
関連ページで確認する
同じ資格で次に知りたいこと
- listとcollections.dequeの違い|スタックとキューの使い分けをPython3エンジニア認定基礎試験で判断する
listとcollections.dequeの違いを、公式チュートリアル5.1.1・5.1.2のスタックとキューの例、pop()とpopleft()の取り出し順、先頭の操作が低速な理由、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- del文とpop()の違い|返り値・スライス・リスト全体の削除をPython3エンジニア認定基礎試験で判断する
del文とlist.pop()の違いを、公式チュートリアルの記述、返り値の有無、スライスとリスト全体の削除、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
- jsonとpickleの違い|保存できる範囲と安全性をPython3エンジニア認定基礎試験で判断する
jsonとpickleの違いを、公式チュートリアル7.2.2が示す扱えるオブジェクトの範囲、他の言語との通信、信頼できないデータを読み込む危険性、dump()・dumps()・load()の使い分け、Python 3 エンジニア認定基礎試験での判断手順と確認問題まで解説します。
よくある質問
Qdataclassとは?
名前付きのデータ項目をまとめるクラスを短く書くための仕組みです。公式チュートリアル9.7が、この用途には dataclasses を使うのが一般的と説明しています。
Qdataclassでは __init__ を書かなくていい?
はい。@dataclass を付けて name: str のように項目を並べるだけで、Employee('john', 'computer lab', 1000) のように作れます。
Qdataclassの型注釈は実行時に検査される?
いいえ。Python 3.9.6で salary: int の項目に 'not int' を渡してもエラーにならず、そのまま入りました。
Qdataclassと通常のクラスで == の結果は違う?
違います。項目の値が同じなら dataclass は True、__init__ だけを書いた通常のクラスは False です。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
