2016-11-20 21 views
0

期間傳遞類引用另一個類,我打算創建一個數據發佈類作爲可變類:Python的建設

class DataDistributor(object): 
    def __init__(self): 
     self.target_trackid = -1 

    def next_sen(self): 
     self.target_trackid += 1 
     return self.target_trackid 

所以,我可以在全球範圍保持指針在我的數據。

我有另一個類:

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_實例。現在取消基於醃製狀態創建新的實例。 –

+0

啊啊!是。我沒有注意到'pickle'是問題所在。我沒有編寫代碼的'pickle'部分,這是我嘗試使用的庫內部。我改變了這部分,現在它工作!謝謝!! –

回答

1

如何爲跟蹤對象的創建類變量爲您創建簡單的類結構會是怎樣?

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))for _ in range(12)]'在別人的庫中,我可以無法控制。看起來像這樣做時,在調用reset()之前,方法(+1到my_counter)被調用12次。並且他們仍然最終是相同的號碼... –

+0

你知道當你做'pickle.loads(pickle.dumps(env))',你實際上沒有創建一個新的對象嗎? 'env'始終引用同一個對象 –

-2

pickle.load將創建不同的對象,這意味着在每個env對象datadistributor變量將參考,

+0

看來你的回答不完整,請修改它以添加任何缺失的信息。 – Tony