def AreYouSingle(func):
""" Test function for verifying singularity """
s1 = func()
s2 = func()
return (s1==s2)
class SingletonBlesserMeta(type):
""" Type for Singleton Blesser class """
@staticmethod
def klsnew(cls, *args):
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
def my_new(cls,name,bases=(),dct={}):
return None
@classmethod
def bless(cls, *args):
for klass in args:
klass.instance = None
if object in klass.__bases__:
klass.__new__ = classmethod(cls.klsnew)
def __init__(cls, name, bases, dct={}, *args):
super(SingletonBlesserMeta, cls).__init__(name, bases, dct)
cls.instance = None
cls.__new__ = cls.my_new
class SingletonBless(object):
""" Bless classes into Singletons """
__metaclass__ = SingletonBlesserMeta
class A(object): pass
class B(object): pass
class C: pass
if __name__ == "__main__":
# Bless the classes to make them singletons
SingletonBless.bless(A, B, C)
print AreYouSingle(A)
print AreYouSingle(B)
# Will work only if class is derived from "object"
# so this prints False
print AreYouSingle(C)