2011-05-20 55 views
0

我在運行時改變一個類的值,然後將它實例化爲一個對象,然後將該對象存儲在另一個類中並將其放入Python字典中。存儲在字典中的Python嵌套對象的問題

這裏是一個小的代碼片段,我寫來說明這個問題:

import unittest 

class cls1(object): 

    def __init__(self, obj): 
     self.obj = obj 

class cls2(object): 

    def __init__(self): 
     self.var = 1 


class Testdict(unittest.TestCase): 

    def __init__(self): 
     self.objs = dict() 

    def runTest(self): 
     obj2 = cls2() 
     obj1 = cls1(cls2()) 

     self.objs["test1"] = obj1 

     self.assertEqual(self.objs["test1"].obj.var, 1) 

     cls2.var = 2 
     self.assertEqual(cls2.var, 2) 
     obj1 = cls1(cls2()) 

     self.objs["test2"] = obj1 

     self.assertEqual(self.objs["test1"].obj.var, 1) 
     self.assertEqual(self.objs["test2"].obj.var, 2) 

if __name__ == "__main__": 
    d = Testdict() 
    d.runTest() 

爲什麼被有它的變種等於2 CLS2不能實例?

我希望這個問題有道理。

+0

請給出您的課程名稱,以大寫字母開頭。我們閱讀起來要容易得多。 – 2011-05-20 21:30:21

+0

對不起,我通常編寫符合pep8的代碼,我只是試圖寫這個匆忙。 – disdanes 2011-05-23 14:41:43

回答

1

你顯示的內容不能工作。永遠。

class Cls2(object): 
    def __init__(self): 
     self.var = 1 

這是一個實例變量。這不是一個類變量。您無法訪問該.varCls2.var該變量只存在該類的每個唯一實例。

 Cls2.var = 2 

不改變self.var實例變量。這會在Cls2類中創建一個新的類變量。

你需要做這樣的事情。現在

class Cls2(object): 
    default= 1 
    def __init__(self): 
     self.var = Cls2.default 

你可以做

Cls2.default= 2 

而且不管它是你正在做的工作應該休息。

+0

謝謝S.Lott,我很感謝你輸入一個例子,它使我很清楚我做錯了什麼。 – disdanes 2011-05-23 14:44:48

0

如果cls2在實例化時沒有覆蓋cls.var,那麼您的測試將工作。

試試這個:

class cls2(object): 

    def __init__(self): 
     try: 
     self.var 
     except: 
     self.var = 1 

try語句只是檢查,看看是否您已經設置var