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

0 投票
2 回答
560 浏览
提问于 2025-04-16 18:03

我在运行时修改一个类的值,然后把它变成一个对象,再把这个对象存到另一个类里,最后放进一个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在它的变量等于2的时候不能被实例化呢?

希望这个问题能让人明白。

2 个回答

0

你的测试会成功,如果cls2在实例化时不覆盖cls.var的话。

试试这个:

class cls2(object):

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

try语句只是用来检查你是否已经设置了var

1

你展示的这个是行不通的,永远都不行。

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

这是一个实例变量,不是类变量。你不能用 Cls2.var 来访问这个 .var。这个变量只在每个类的独特实例中存在。

        Cls2.var = 2

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

你需要这样做。

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

现在你可以这样做

Cls2.default= 2

然后你正在做的其他事情应该就能正常工作了。

撰写回答