2016-11-20 6 views
0

中に他のクラスへのクラス参照を渡します。Pythonは私が可変クラスとしてデータ分配クラスを作成しようとしています建設

は、私は別のクラスを持っている:

class Env(object): 
     def __init__(self, distributor): 
      self.distributor = distributor 
      self.target_trackid = 0 # init 
     def reset(self): 
      self.target_trackid = self.distributor.next_sen() 

私は多くのEnvインスタンスを作成したときに、各Envインスタンスは異なるデータポイントを取得します。

だから私は私のインスタンスを作成するためにこれを使用します。

ddist = DataDistributor() 
env = Env(ddist) 
envs = [pickle.loads(pickle.dumps(env)) for _ in range(12)] 

envs[0].reset() 
envs[1].reset() 
envs[2].reset() 

print envs[0].target_trackid 
print envs[1].target_trackid 
print envs[2].target_trackid 

、結果がすべて同じである:0の束。

私はPythonはこれを処理しているか正確にはわからない:(と私が達成したいものを達成するための実行可能な解決策があるかどうか!

+0

あなたは何をしようとしているのか分かりません。ダンプしてすぐにピクルスを積み込む点は何ですか?そして、あなたはどんなアウトプットを期待していますか? –

+0

あなたは 'Env'の_one_インスタンスを持っています。現在、unpicklingはピクルされた状態に基づいて新しいインスタンスを作成します。 –

+0

Ahhhh !!!!はい。私はピクルが問題であることに気付かなかった。私は、コードの 'pickle'部分を書きませんでした。これは、私が使用しようとしているライブラリの中にあります。私はその部分を変更し、今それは動作します!ありがとう!! –

答えて

1

方法をREFEREますあなたのシンプルなクラス構造は次のようになります:?

class Env(object): 
    my_counter = 0 # Your class variable 

    def __init__(self, param1, param2): 
     # some initialization 
     Env.my_counter += 1 # increament everytime object is created 
     # some logic 

サンプル実行:

>>> e1 = Env('p11', 'p12') # creation of first object 
>>> Env.my_counter 
1  # value of counter set as 1 

>>> e1 = Env('p21', '22') # creation of second object 
>>> Env.my_counter 
2  # value of counter set as 2 

はいくつかの他のクラスの作成されたオブジェクトを追跡するための異なるクラスのオブジェクトを渡すと、それは間違いなく正しいアプローチではありません。

+0

私はクラス変数の存在を知らなかった。これははるかに良い答えです!ありがとう! –

+0

ああ...私はこれが具体的な問題を解決するとは思わない... 'envs = [pickle.loads(pickle.dumps(env))in range(12)]'は誰かのライブラリにありますコントロールできません。これを行うと、reset()を呼び出す前に、メソッド(+ to my_counter)が12回呼び出されたようです。そして、彼らはまだ同じ数字になってしまいます... –

+0

'pickle.loads(pickle.dumps(env))'をしたら、実際に新しいオブジェクトを作成していませんか? 'env'は常に同じオブジェクトを参照しています –

-2

pickle.loadは、各envオブジェクトでdatadistributor変数を意味している別のオブジェクトを作成します。作成されたオブジェクトを追跡するための変数クラスを作成する方法について

+0

あなたの答えは不完全なようですので、不足している情報を追加するために編集してください。 – Tony

関連する問題