データクラスを定義する
@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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- データクラスを定義する
- デフォルト値とfield()
- Frozenと比較のオプション
- attrsライブラリ