AI資格ドリル
資格を選ぶ↓

用語比較

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冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

データを入れるだけのクラスでも __init__ を毎回書いている人

公式チュートリアル9.7は、名前付きのデータ項目をまとめる用途には dataclasses を使うのが一般的だと説明しています。項目名と型注釈を並べるだけで Employee('john', 'computer lab', 1000) と作れます。

02

dataclass の項目の型注釈が実行時に検査されると考える人

Python 3.9.6で salary: int の項目に 'not int' を渡しても、エラーにならずそのまま入ります。型注釈は項目を並べるための書き方で、型の検査をする仕組みではありません。

03

同じ値の2つのインスタンスは通常のクラスでも == で True になると考える人

__init__ だけを書いた通常のクラスでは、同じ値の2つを == で比べると False になります。dataclass では項目の値が同じなら True です。

問題文から答えを選ぶ手順

  1. 1

    何のためのクラスかを確認する

    名前付きのデータ項目をまとめるのが目的なら dataclass です。公式チュートリアル9.7がこの用途に dataclasses を使うのが一般的と説明しています。

  2. 2

    __init__ を書いているかを確認する

    @dataclass の下に項目を並べるだけなら、__init__ は書きません。通常のクラスなら __init__ が要ります。

  3. 3

    print や == の結果を問われたら、どちらのクラスかを確認する

    dataclass は項目名と値が並ぶ表示で、同じ値なら == が True です。通常のクラスは object at 0x… の表示で、== は False です。

  4. 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 と言える
  • 型注釈は実行時に値の型を検査しないと知っている

同じ資格で次に知りたいこと

よくある質問

Qdataclassとは?

A

名前付きのデータ項目をまとめるクラスを短く書くための仕組みです。公式チュートリアル9.7が、この用途には dataclasses を使うのが一般的と説明しています。

Qdataclassでは __init__ を書かなくていい?

A

はい。@dataclass を付けて name: str のように項目を並べるだけで、Employee('john', 'computer lab', 1000) のように作れます。

Qdataclassの型注釈は実行時に検査される?

A

いいえ。Python 3.9.6で salary: int の項目に 'not int' を渡してもエラーにならず、そのまま入りました。

Qdataclassと通常のクラスで == の結果は違う?

A

違います。項目の値が同じなら dataclass は True、__init__ だけを書いた通常のクラスは False です。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)