2016-08-16 57 views
2

我有一個名爲run_c的類,它正在用於初始化和執行運動仿真的運行。在執行run_c.__init__()之前,我將默認值分配給run_c的屬性,例如x。所有__init__()正在提取用戶輸入值,彙總到字典中,並將它們分配給run_c中的相應屬性(如果它們存在)。例如...對象保留以前循環迭代的信息

import vars.Defaults as dft 
class run_c: 

    ... 
    dt  = dft.dt 
    x  = dft.x0 
    states = [ [], [], [], [] ] 
    ... 

    def __init__(self, input): 
     for key in input.keys(): 
     if hasattr(self, key): setattr(self, key, input[key]) 
     ... 
     self.execute() 

run_c.states是正在使用,因爲他們與時間步更改記錄的run_c屬性的值列表的列表。稍後,在run_c.execute()內,我將x值存儲在states[1]中,增加時間步dt,並使用速度和時間步更新x。這很簡單的東西,對不對?...

雖然這是問題的開始。 run_c的實例第一次被創建,初始化和執行,它運行完美。但是,我正在通過創建,初始化和執行基於JSON文件讀取列表的多個運行來操作此模擬。因此,駕駛員模塊中...

from Run import run_c 
def main(): 
    ... 
    for runEntry in runList: 
     currRun = run_c(runEntry) 
     ... 
    ... 

什麼情況是,已存儲在run_c.states的所有值沒有得到循環的每次迭代後擦拭。我認爲每次運行循環時都會創建run_c的新實例,以執行新增信息的__init__()。爲什麼數據值(例如x的舊值在每個循環結束後保留​​)?

更新:當我添加一行代碼將states的值重置回__init__()中的空列表時,問題就消失了。但是,這不應該是我想要做的必要步驟...應該嗎?

+0

你多久創建一個* states,新的空*列表?一次:定義類時。列表對象不會爲每個新實例重置。 – deceze

+0

那麼列表中的'states'只能被分配並且從不使用?當我提到'self.states'時,它是一個完全獨立的實體嗎?或者它更類似於全局變量而不是類變量? –

回答

7

dtx,和states被定義爲變量,不實例變量。你製作的這個班的每一個實例都會分享它們。如果你需要他們每次生成一個新的實例時進行初始化,這正是__init__()是:

class run_c: 

    def __init__(self, input): 
     ... 
     self.dt  = dft.dt 
     self.x  = dft.x0 
     self.states = [ [], [], [], [] ] 
     ... 

     for key in input.keys(): 
     if hasattr(self, key): setattr(self, key, input[key]) 
     ... 
     self.execute() 
0

除了現有的答案:你可以在__new__方法來初始化這些變量。

class A: 
    val = 1 

    def __new__(cls, v): 
     t = super().__new__(cls) 
     t.val = v 
     return t 

    def __init__(self, v): 
     val = v 

a, b = A(1), A(2) 

print(a.val, b.val) 

如果刪除__new__法,output'd是1 1否則1 2

+0

@BruceDavidWilner,不,沒有人會因爲「超級」不關心它而在類層次結構中陷入困境。不,這些'神奇'方法的語義並不難理解:你只寫一次,當你使用你的類時,你根本看不到它們。這個答案顯示瞭如何將變量的定義移動到__init__中並實現OP的目標,就是這樣。 – ForceBru