2011-05-20 51 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