python __init__ を用いた class の最初期化
はじめに
python の 初期化メソッド __init__ は他のメソッドから呼ぶこともでます。
これが正しい使い方なのかは不明です。
やりたいことの説明
初期化メソッドから呼び出されて保持しているリストなどの状態を変更したい。
例えば、リスト[0, 1, 2, n, 4]を状態として持ち、初期化時の引数として n を与えるクラスをインスタンス化した後に、再び n の値を変更したい。
意図した動作を実現できない方法
上記コードでは、 [0, 1, 2, self.n, 4] を self.n = 3 で初期化したあと、update メソッドを呼んで self.n = 100 としています。
しかし update 後もリストは最初に定義した[0, 1, 2, 3, 4]のままです。
なぜなら、リストは self.n への参照を持っているのではなく、self.__init__() において list が呼び出され、[0, 1, 2, 3, 4] の状態を持つリストが作成されたためです。
意図した動作を実現する方法
リストの更新には、 __init__() メソッドを再び呼べばよいです。
上記コードでは、update メソッドにおいて、__init__メソッドを呼び出してクラスを再初期化しています。
update 前は[0, 1, 2, 3, 4] だったリストが、update 後は[0, 1, 2, 100, 4] に変更されています。
また、__init__メソッドの呼び出しは再初期化であり、__init__メソッドの前後でインスタンスの id は変化しません。
おわりに
__init__() のあまり見ない使い方ですが、これができると楽に書ける部分があったので試してみました。
ただ、プログラムの作法としての正しさはわかりません。
2021 12 13