- くだすれPython(超初心者用) その31©2ch.net
144 :デフォルトの名無しさん[sage]:2016/10/21(金) 12:05:56.55 ID:nZioU6Ll - 次のクラスを使う、ただしフィールドは不変な値(int, str, tupleなど)のみで構成すること
collections.namedtuple (<= 3.4) typing.NamedTuple (>= 3.5)
|
- くだすれPython(超初心者用) その31©2ch.net
145 :デフォルトの名無しさん[sage]:2016/10/21(金) 12:13:35.87 ID:nZioU6Ll - 注意としてはフィールドへの再代入は防げても変数自体への再代入は防げない
これはPythonのほかのオブジェクトでも同じ
|
- くだすれPython(超初心者用) その31©2ch.net
147 :デフォルトの名無しさん[sage]:2016/10/21(金) 16:15:11.73 ID:nZioU6Ll - ああ、データ型と書かれていたので操作が伴わないレコードをイメージしてnamedtupleを挙げた
不変のクラスを作るといっても下の4点を守りつつclass文で定義するだけだよ フィールドは名前の先頭にアンダースコアを付けて触るなアピールする 外から参照したいフィールドがあるときはpropertyを使ってget操作のみ定義する __init__()以外のメソッドではフィールドを絶対に書き換えない フィールドを変更したいときは新しい値でオブジェクトを生成してreturnで返す
|
- くだすれPython(超初心者用) その31©2ch.net
149 :デフォルトの名無しさん[sage]:2016/10/21(金) 16:44:30.79 ID:nZioU6Ll - propertyのそれをやってくれるのがnamedtupleなんだけどね
>>147で失念してたけど後からフィールド付け足しできないように__slots__を指定する必要もあった
|