我在运行时更改类的值然后将其实例化为对象,然后将该对象存储在另一个类中并将其放入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?
我希望这个问题有道理。
答案 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
。