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.データクラスのインポート:
dataclassesモジュールがインポートされます。
2.Personクラスの定義:dataclassデコレータを使用して、Personクラスをデータクラスとして定義します。frozen=Falseとしているため、このクラスのインスタンスの属性は変更可能です。firstname,lastname,age,memosという4つの属性を持っています。memosは、デフォルトで空のリストとして初期化されるようにdataclasses.field(default_factory=list)を使用して定義されています。
3.リストmsの作成:msというリストに['married', 'AB']という2つの文字列が格納されます。
4.Personインスタンスの作成:msをmemos属性として使用して、Personクラスの新しいインスタンスpを作成します。
リストの変更:
5.msmsリストに'dog'を追加します。この時点で、p.memosも更新されるのは、msリストそのものへの参照を持っているためです。
6.インスタンスの表示:pを表示すると、memosには['married', 'AB', 'dog']が格納されていることがわかります。
7.新しいPersonインスタンスの作成:- 新しい
Personインスタンスを作成し、再度pとして代入します。このとき、memosには['married', 'AB']の2つの要素だけが格納されています。
- 新しい
属性の直接変更:
8.memosp.memos.append('dog')を使用して、pインスタンスのmemos属性に直接'dog'を追加します。
9.インスタンスの再表示:- 再度
pを表示すると、memosには再び['married', 'AB', 'dog']が格納されていることが確認できます。
- 再度
このコードは、Pythonのデータクラスを使用して、属性のデフォルト値の設定や、ミュータブルな属性(この場合はリスト)の操作方法を示しています。
コメント