11.3.3イミュータブルなクラス
>>> import dataclasses
>>>
>>> @dataclasses.dataclass(frozen=True)
... class Person:
...    firstname: str
...    lastname: str
...    age: int = 0
...    memos: list = dataclasses.dataclasses.field(defarult_factory=list)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 6, in Person
AttributeError: module 'dataclasses' has no attribute 'dataclasses'. Did you mean: 'dataclass'?
>>>

上記はエラーが出る書き方だそうです。


>>> import dataclasses
>>>
>>> @dataclasses.dataclass(frozen=False)
... class Person:
...    firstname: str
...    lastname: str
...    age: int = 0
...    memos: list = dataclasses.field(default_factory=list)
...
>>> ms = ['married', 'AB']
>>> p = Person('太郎', '山田', 58, ms)
>>> #初期化メソッドに渡したオブジェクトを変更
>>> ms.append('dog')
>>> print(p)
Person(firstname='太郎', lastname='山田', age=58, memos=['married', 'AB', 'dog'])
>>>
>>> p = Person('太郎', '山田', 58, ['married', 'AB'])
>>> #フィールド経由で取得したオブジェクトを変更
>>> p.memos.append('dog')
>>> print(p)
Person(firstname='太郎', lastname='山田', age=58, memos=['married', 'AB', 'dog'])
>>>
  1. 1.データクラスのインポート:
    • dataclassesモジュールがインポートされます。

  2. 2.Personクラスの定義
    :
    • dataclassデコレータを使用して、Personクラスをデータクラスとして定義します。
    • frozen=Falseとしているため、このクラスのインスタンスの属性は変更可能です。
    • firstname, lastname, age, memosという4つの属性を持っています。
    • memosは、デフォルトで空のリストとして初期化されるようにdataclasses.field(default_factory=list)を使用して定義されています。

  3. 3.リストmsの作成
    :
    • msというリストに['married', 'AB']という2つの文字列が格納されます。

  4. 4.Personインスタンスの作成
    :
    • msmemos属性として使用して、Personクラスの新しいインスタンスpを作成します。

  5. 5.ms
    リストの変更
    :
    • msリストに'dog'を追加します。この時点で、p.memosも更新されるのは、msリストそのものへの参照を持っているためです。

  6. 6.インスタンスの表示
    :
    • pを表示すると、memosには['married', 'AB', 'dog']が格納されていることがわかります。

  7. 7.新しいPersonインスタンスの作成
    :
    • 新しいPersonインスタンスを作成し、再度pとして代入します。このとき、memosには['married', 'AB']の2つの要素だけが格納されています。

  8. 8.memos
    属性の直接変更
    :
    • p.memos.append('dog')を使用して、pインスタンスのmemos属性に直接'dog'を追加します。

  9. 9.インスタンスの再表示
    :
    • 再度pを表示すると、memosには再び['married', 'AB', 'dog']が格納されていることが確認できます。

このコードは、Pythonのデータクラスを使用して、属性のデフォルト値の設定や、ミュータブルな属性(この場合はリスト)の操作方法を示しています。