Python嵌套对象存在于字典中的问题

时间:2011-05-20 21:24:05

标签: python class object dictionary

我在运行时更改类的值然后将其实例化为对象,然后将该对象存储在另一个类中并将其放入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()

为什么cls2没有实例化它的var等于2?

我希望这个问题有道理。

2 个答案:

答案 0 :(得分:1)

你所展示的内容无法奏效。如初。

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

这是一个实例变量。它不是类变量。您无法使用.var访问Cls2.var该变量仅存在 该类的每个唯一实例。

        Cls2.var = 2

不会更改self.var实例变量。这会在Cls2类中创建一个新的类变量。

你需要做这样的事情。

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

现在你可以做到

Cls2.default= 2

其他任何你正在做的事都应该有用。

答案 1 :(得分:0)

如果cls2在实例化时没有覆盖cls.var,那么您的测试将起作用。

试试这个:

class cls2(object):

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

try语句只是检查您是否已设置var