11.3.2フィールドのカスタマイズ

>>> import dataclasses
>>>
>>> @dataclasses.dataclass()
... class Person:
...    firstname: str
...    lastname: str
...    age: int = dataclasses.field(default=0, compare=False)
...
>>> if __name__ == '__main__':
...    p1 = Person('太郎', '山田', 58)
...    p2 = Person('太郎', '山田', 11)
...    print(p1 == p2)
...
True
  1. 1.モジュールのインポート:

    • dataclasses モジュールをインポートしています。このモジュールは、クラスの生成に関するいくつかのボイラープレートコードを省略するのに役立つユーティリティを提供しています。

  2. 2.データクラスの定義
    :

    • @dataclasses.dataclass() デコレータを使用して、Person クラスをデータクラスとして宣言しています。
    • このクラスには、firstname, lastname, そして age の3つのフィールドが定義されています。

  3. 3.フィールドの特性
    :

    • age フィールドは、dataclasses.field() 関数を使って特別な特性を持たせています。
    • default=0 は、age のデフォルト値として 0 を設定しています。
    • compare=False は、age フィールドを2つのインスタンスを比較する際に無視するようにしています。

  4. 4.メインの実行
    :

    • 2つの Person オブジェクト (p1p2) を作成しています。両方とも firstnamelastname は同じですが、age は異なります。
    • print(p1 == p2) は2つのオブジェクトが等しいかどうかを確認します。agecompare=False として設定されているため、この比較では無視され、結果は True となります。

結果として、p1p2age 属性は異なるにも関わらず、両方のオブジェクトは等しいと見なされます。これは、age がオブジェクトの比較に使用されないためです。



field関数のキーワード引数
キーワード 概要
default 既定値
default_factory 既定値を生成するための関数
init __init__メソッドの引数に現在のフィールドを含めるか
repr __repr__メソッドの戻り値に現在のフィールドを含めるか
compare __eq__,__gt__などの判定に現在のフィールドを含めるか
hash ハッシュ値の生成に現在のフィールドを利用するか