我有一个遵循Singleton模式的类,如下所示。在Python模块automaton.py
中,我有:
class Automaton(object):
def launch_probe(self):
if hasattr(self, 'launched') and self.launched:
return
print "Launched!"
self.launched = True
automaton = Automaton()
我从各种其他模块中调用对象上的方法。我没有其他任何地方可以实例化这个类,我希望经常调用方法或访问属性,这样很容易保持对它的访问:
from automaton import automaton
automaton.launch_probe()
print 'Status:'
print automaton.launched
但是,现在我正在努力更好地测试此代码,并希望重置setUp()中单元测试之间的单例。
import automaton
def setUp():
automaton.automaton = automaton.Automaton()
然而,这并没有完成工作,因为其他加载的模块都引用了原始的Singleton。我可以切换到我用Automaton.get_instance()
获取单例的模式,或者只是导入模块并引用该模块中的变量,但我发现这使得主要的生产代码更加冗长,更难以遵循。我曾经考虑过尝试将automaton
变量设为描述符,因此它具有智能,但发现描述符仅适用于类。我正在考虑的最后一种方法是尝试通过清除它的字典并调用它的Automaton
方法来重新初始化__init__
的现有实例。这样的推荐方法是什么?
答案 0 :(得分:0)
许多可用选项中的一个是提供一种方法将单例重置为状态零(初始状态),例如:
class Automaton(object):
def __init__(self):
self.reset()
def reset(self):
self.launched = False
def launch_probe(self):
if hasattr(self, 'launched') and self.launched:
return
print("Launched!")
self.launched = True
automaton = Automaton()
if __name__ == "__main__":
import unittest
class Test(unittest.TestCase):
def setUp(self):
automaton.reset()
def test1(self):
automaton.launch_probe()
self.assertEqual(automaton.launched, True)
def test2(self):
self.assertEqual(automaton.launched, False)
unittest.main()