2017-03-29 10 views
1

多少簡単な質問ですが、Pythonでのクラスの動作を正確に理解するのに役立ちたいと思います。特に、クラス変数はいつ設定され、そのクラスのインスタンスが作成されるたびに上書きされますか?共有クラス変数を適切に保存するには?

これは一般的な状況です。あるクラスのすべてのインスタンスにアクセスできるようにするデータの表があります。問題は、このテーブルがデータベースサーバー上にあることです。私はデータベースに自動的に接続し、このクラスのインスタンスが初めて作成されたときにこのテーブルをメモリに取り込みたいが、それ以降は何もしない。

これはクラス変数のように思えますが、これが正しいかどうかを確認したかっただけです。私のプログラムはこのクラスの数百のインスタンスを作成しているので、間違いなく同じテーブルの何百ものデータベース呼び出しを作成したり、同じテーブルの何百ものコピーをメモリに格納したりすることは間違いありません。

私は次のような記述ができますか? "get_table_from_db"は、データベースに接続し、関連するテーブルと共にpandasデータフレームを返す関数であると仮定します。私はこのスクリプトを実行するとOBJ1が作成され、TABLE1に関連したデータフレームを格納しているとき

class ExampleClass: 
    table1 = get_table_from_db(arguments) 
    def __init__(self, x, y): 
     self.value = self.table1.iloc[x, y] 

obj1 = ExampleClass(0, 0) 
obj2 = ExampleClass(0, 1) 

は基本的に、私はかつて「get_table_from_db」を実行する前または。 obj2が作成されると、table1がすでに存在するため、「get_table_from_db」を再度呼び出すことはしません。しかし、私はそれがそれに利用可能なデータを必要とするため、いくつかのメソッドのためにtable1へのアクセス権を持ちたいと思います(例として、self.valueをテーブル内の特定のセルに等しく割り当てましたが、それよりも複雑になる)。

また、同様の質問です。上記の方法がうまくいけば、クラス内からクラス変数をリセットできますか?例えば、次のようなものは、クラスのすべてのインスタンスのクラス変数を変更することができますか?あなたのコードは、あなたが思うように動作しますので、

class ExampleClass: 
    table1 = get_table_from_db(arguments) 
    def __init__(self, x, y): 
     self.value = self.table1.iloc[x, y] 
    def reset_table(self): 
     ExampleClass.table1 = get_table_from_db(arguments) 

答えて

3

クラス変数は、クラスが宣言されたときに、一度初期化されます(そうobj1またはobj2のいずれかの前に作成されます)。あなたの2番目の質問に関して

、あなたはこのようにそれを行う必要があります:あなたはExampleClassのインスタンスを必要とせずにobj.reset_table()またはExampleClass.reset_table()のいずれかを呼び出すことができます

class ExampleClass: 
    @classmethod 
    def reset_table(cls): 
     cls.table1 = get_table_from_db(arguments) 

その方法。

関連する問題