【问题标题】:Problem with Python nested objects being stored in a dictionaryPython嵌套对象存储在字典中的问题
【发布时间】:2011-05-20 21:24:04
【问题描述】:

我在运行时更改类的值,然后将其实例化为一个对象,然后将该对象存储在另一个类中并将其放入 python 字典中时遇到了一些麻烦。

这是我写的一个小代码sn-p来说明问题:

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?

我希望这个问题有点道理。

【问题讨论】:

  • 请提供以大写字母开头的班级名称。我们更容易阅读。
  • 对不起,我通常写符合pep8的代码,我只是想匆忙写下来。

标签: python class object dictionary


【解决方案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

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

【讨论】:

  • 感谢 S.Lott,感谢您输入一个示例,它清楚地说明了我做错了什么。
【解决方案2】:

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

试试这个:

class cls2(object):

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

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

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2014-03-04
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多