def test_simple(): class A(object): __metaclass__ = Singleton def __init__(self): self.a = 1 a1 = A() a2 = A() assert a1 is a2 assert a1.a == 1 a1.a = 5 assert a2.a == 5 def test_init_with_parameters(): class A(object): __metaclass__ = Singleton def __init__(self, a): self.a = a a1 = A(1) a2 = A(2) assert a1 is a2 assert a1.a == 1 a1.a = 5 assert a2.a == 5 class Singleton(type): def __init__(self, name, bases, dictionary): self._obj = None def __call__(self, *args): if self._obj is not None: return self._obj else: self._obj = type.__call__(self, *args) return self._obj