0Pricing
Python Academy · レッスン

データクラスを定義する

@dataclassで定型コードを減らします

「データクラスを定義する」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

データクラスを使う理由

主にデータを保持するクラスを書くと、同じ定型コードを繰り返すことになります。たとえば、__init__、__repr__、__eq__などです。dataclassesモジュールを使えば、単純なフィールド宣言からこれらをすべて自動生成できます。

  • 書くコードも読むコードも少なくなります。
  • __init__のタイプミスが起きにくくなります。
  • Python 3.7以降の標準ライブラリに組み込まれています。

従来の方法

ここでは、点を格納する通常のクラスを示します。2つの数値を格納するだけなのに、どれだけ多くのコードを書く必要があるかに注目してください。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
print(p.x, p.y)

@dataclassデコレーター

クラスの上に@dataclassを適用し、型アノテーションを付けてフィールドを宣言します。Pythonが__init__を自動的に生成します。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p.x, p.y)

__repr__の自動生成

データクラスは読みやすい__repr__も生成するため、オブジェクトを出力するとメモリアドレスではなくフィールドが表示されます。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(3, 4))

__eq__の自動生成

すべてのフィールドが等しい場合、2つのデータクラスのインスタンスは等しいと判定されます。__eq__を手作業で書く必要はありません。

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

print(Point(1, 2) == Point(1, 2))
print(Point(1, 2) == Point(9, 9))

型アノテーションは必須

各フィールドには必ず型アノテーションを付ける必要があります。データクラスの仕組みは、このアノテーションによって、その名前がフィールドであることを認識します。アノテーションなしの単なる代入は、フィールドではなく通常のクラス属性になります。

from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

u = User('Alice', 30)
print(u)

メソッドの追加

データクラスも通常のクラスです。生成されたフィールドを使う通常のメソッドを追加できます。

from dataclasses import dataclass

@dataclass
class Rectangle:
    width: int
    height: int

    def area(self):
        return self.width * self.height

r = Rectangle(3, 4)
print(r.area())

フィールドの変更

デフォルトではデータクラスのインスタンスは変更可能です。そのため、通常の属性と同じように、作成後にフィールドを再代入できます。

from dataclasses import dataclass

@dataclass
class Counter:
    value: int

c = Counter(0)
c.value += 5
print(c.value)

asdictとastuple

asdict()とastuple()のヘルパー関数を使うと、インスタンスを辞書またはタプルに変換できます。シリアライズに便利です。

from dataclasses import dataclass, asdict, astuple

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)
print(asdict(p))
print(astuple(p))

ネストしたデータクラス

データクラスのフィールド自体を別のデータクラスにできます。生成された__repr__とasdict()は、ネストされた構造にも再帰的に適用されます。

from dataclasses import dataclass, asdict

@dataclass
class Address:
    city: str

@dataclass
class Person:
    name: str
    address: Address

p = Person('Bob', Address('Paris'))
print(asdict(p))

データクラスを使う場面

関連する値をまとめることが主な役割のクラスには、データクラスを使うとよいでしょう。

  • 設定オブジェクト
  • 関数から返されるレコード
  • 座標や金額などの単純な値型

データよりも振る舞いが中心となるクラスでは、通常のクラスのほうが読みやすい場合があります。

確認問題

@dataclassデコレーターは何を自動的に生成しますか。

まとめ

@dataclassを使って定型コードを減らす方法を学びました。

  • 型アノテーションを付けてフィールドを宣言します。
  • __init__、__repr__、__eq__が生成されます。
  • asdict()とastuple()を使ってインスタンスを変換します。
  • メソッドを追加したり、データクラスをネストしたりすることもできます。

よくある質問

「データクラスを定義する」レッスンは無料ですか?

はい。「データクラスを定義する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「データクラスを定義する」で何を学びますか?

@dataclassで定型コードを減らします ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「データクラスを定義する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データクラスを定義する
  2. デフォルト値とfield()
  3. Frozenと比較のオプション
  4. attrsライブラリ
← Python Academyに戻る