getInstance()のような操作は不要です。
>>> from singleton import Singleton >>> class SubClass(Singleton): ... pass ... ... >>> sub = SubClass() >>> sub.value = 1 >>> print(sub.value) 1 >>> SubClass().value 1
本体です。
#!/usr/bin/env python # -*- coding: utf-8 -*- class _Singleton(type): """ Python 2.xと3.xの両方をサポートするためには、このように継承しなければならない。 class SubClass(_Singleton('Singleton', (object, ), {})): pass """ __instances = {} def __call__(cls): if cls not in cls.__instances: cls.__instances[cls] = super(_Singleton, cls).__call__() return cls.__instances[cls] # _SingletonをPython 2.xでも3.xでも使えるように継承するのは手間なので、このクラスでラップしている class Singleton(_Singleton('Singleton', (object, ), {})): """ このクラスを継承するとシングルトンになる。 class SubClass(_Singleton): pass """ passテストです。
#!/usr/bin/env python # -*- coding: utf-8 -*- import unittest2 as unittest from singleton import Singleton class TestSingleton(Singleton): pass class AnotherTestSingleton(Singleton): pass class SingletonTest(unittest.TestCase): def test_same_instance(self): self.assertTrue(TestSingleton() is TestSingleton()) def test_hold_value(self): singleton = TestSingleton() singleton.value = "This is value." self.assertEqual(singleton.value, TestSingleton().value) def test_independent(self): singleton = TestSingleton() singleton.value = "This is value." self.assertFalse(singleton is AnotherTestSingleton()) self.assertFalse(hasattr(AnotherTestSingleton(), 'value')) if __name__ == '__main__': unittest.main()Gistにもあります。
0 件のコメント:
コメントを投稿