(python番外編)pythonにおけるオブジェクトの共有

こんにちは、mobazouです。ここでまた脇道にそれて、pythonでのオブジェクト間で情報をやりとりをする際に、メソッドのパラメータではないオブジェクト(インスタンス)の共有による情報のやりとりに触れておきます。

何故オブジェクトの共有なのか

 プログラムを簡素化しメンテナンス性をよくするためには、プログラムのオブジェクトによる分割は必要不可欠です。
 分割したオブジェクトは連携して使う必要がありますが、よくあるのが関数のように使う方法です。オブジェクトから他のオブジェクトを生成し、そのオブジェクトに値を渡してそのオブジェクトのメソッド(関数など)から値を取得するという方法です。

 一見、これだけで値を受け渡せばいいように思えますが、この方法の欠点は、生成したオブジェクトが勝手に消えてしまう(終わってしまう)と、もう値が得られなくなってしまうことです。
 どういうときに相手が消えてしまうかというと、たとえばダイアログを生成しダイアログから値を取得して戻り待ちをしていて、相手から処理が戻るときにはすでに相手(ダイアログ)は消えているという場合です。そんな時は、オブジェクト(インスタンス)を共有し、相手が消えても共有したオブジェクトから値を得ればいいのです。

 このようにオブジェクト共有による値の受け渡しが必要なケースは身近なのですが、あまりプログラム例としては出てきません。またこれは言語仕様としてもあまり語られることがなく、新しい言語を使う度に、その実現方法に悩まされてしまいます。

具体的なオブジェクト共有の例

 pythonの場合は以下のようなクラスを記述し、インポートすることでこのクラスのインスタンス(オブジェクト)を共有することができます。

■globals.py

class GlobalValues:
    def __init__(self):
        self.id = ""
        self.company_id = ""
        self.pw = ""
        
gv = GlobalValues() #ここでインスタンスを生成している 

■write.py

from globals import *
import sys

class input_id:

    def __init__(self):
        gv.id ="00001"
        gv.company_id = "companyid"
        gv.pw ="password
        sys.exit()

上記の場合、たとえ書き込んだipnut_idクラスがsys.exit()で死んだとしても、このgvは生きているので、globalsからGlobalValuesをインポートした他のクラスからは、このgvの値はいつでも読むことができます。

何故共有できるのか

ちなみに何故このようなことができるかというと、上記で「from globals import *」とした時点で、globals.pyの「gv = GlobalValues()」が実行され、インスタンスが生成(含む初期化)されるためのようです。pythonは原則import時点で実行されるのが仕様のようです。

そのため例えばこの続きに「print("gvインスタンス生成")」という文を書いた場合、import * の時点でコマンドラインに「gvインスタンス生成」が表示されます。もしimportしただけでインスタンスの生成または処理の実行をしたくない場合は、メイン処理の前に以下の条件文を付与します。

if __name__ == '__main__':
    print("gvインスタンス生成")

今回はいかがでしたでしょうか。この記事がお役に立ちましたら「ハートボタン」「フォロー」「サポート」「コメント」での応援よろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?