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()
为什么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
然后你正在做的其他事情应该就能正常工作了。