11.3データクラス

データクラスは、Python 3.7 から導入された新しいクラス定義機構で、主に単純なデータの保持のためのクラスを簡潔に定義できるようにするものです。具体的には、データクラスを使用することで、属性の定義や一般的なメソッド(例:__repr____eq__)の自動生成が可能になります。

データクラスを利用するためには、dataclasses モジュールの dataclass デコレータをクラス定義の前に付けます。

(1)基本メソッドを自動生成してくれる

(2)イミュータブルなオブジェクトを生成できる

(3)メソッドは自由に追加できる

11.3.1データクラスの基本

>>> import dataclasses
>>>
>>> @dataclasses.dataclass(frozen=True)
... class Person:
...    firstname: str
...    lastname: str
...    age: int = 0
...    def show(self):
...       print(f'私の名前は{self.lastname}{self.firstname}です!')
...
>>> if __name__ == '__main__':
...    p1 = Person('太郎', '山田', 58)
...    p2 = Person('太郎', '山田', 58)
...    print(p1)
...    print(p1 == p2)
...
Person(firstname='太郎', lastname='山田', age=58)
True
>>>
  1. モジュールのインポート:

    python
    import dataclasses
    • Pythonの dataclasses モジュールをインポートしています。これは、データクラスの作成を簡易にするためのモジュールです。
  2. データクラスの定義:

    python
    @dataclasses.dataclass(frozen=True) class Person: firstname: str lastname: str age: int = 0
    • @dataclasses.dataclass(frozen=True) は、Person クラスをデータクラスとして定義するデコレータです。
    • frozen=True の部分は、生成されたインスタンスを変更不可能(イミュータブル)にするためのオプションです。
    • firstname, lastname, age はクラスの属性です。age にはデフォルトの値として 0 が設定されています。
  3. メソッドの定義:

    python
    def show(self): print(f'私の名前は{self.lastname}{self.firstname}です!')
    • show メソッドは、人物の名前を表示するためのメソッドです。
  4. メインの処理:

    python
    if __name__ == '__main__': p1 = Person('太郎', '山田', 58) p2 = Person('太郎', '山田', 58) print(p1) print(p1 == p2)
    • ここでは Person クラスの2つのインスタンス、p1p2 を作成しています。両方のインスタンスには同じ値が設定されています。
    • print(p1) は、p1 インスタンスの文字列表現を表示します。dataclass を使用しているため、特別な文字列表現メソッドを定義しなくても、属性の内容が表示されます。
    • print(p1 == p2) は、p1p2 が同じかどうかを確認します。データクラスでは、属性の値がすべて同じ場合、2つのインスタンスは等しいと見なされます。この例では True が返されます

① @gataclassデコレーターを付与する
オプション 概要 既定値
init __init__メソッドを自動生成するか True
repr __repl__メソッドを自動生成するか True
eq __eq__メソッドを自動生成するか True
order __lt__,__le__,__gt__,__ge__メソッドを自動生成するか False
unsafe_hash 無条件に__hash__メソッドを自動生成するか False
frozen クラスをイミュータブルするか False

②フィールドを宣言する
構文フィールドの宣言
フィールド名:型[= 既定値]
例?
def __init__(self, firstname: str, lastname: str, age: int = 0): ~

③メソッドを宣言する

④データクラスの初期化と比較