__init__() による再初期化

はじめに

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__() のあまり見ない使い方ですが、これができると楽に書ける部分があったので試してみました。
ただ、プログラムの作法としての正しさはわかりません。

コメント

タイトルとURLをコピーしました