在Python

时间:2016-12-16 01:45:01

标签: python python-2.7 singleton

我有一个遵循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__的现有实例。这样的推荐方法是什么?

1 个答案:

答案 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()