def __init__(cls, name, bases, dictionary):
if type(cls.__init__) is UnboundMethodType:
initializer = cls.__init__
elif type(cls.__new__) is FunctionType:
initializer = cls.__new__
else:
# noinspection PyUnusedLocal
def initializer(self, *args, **kw): pass
# noinspection PyShadowingNames
@preserve_signature(initializer)
def instance_creator(cls, *args, **kw):
key = (args, tuple(sorted(kw.iteritems())))
try:
hash(key)
except TypeError:
raise TypeError('cannot have singletons for classes with unhashable arguments')
if key not in cls.__instances__:
cls.__instances__[key] = super(Singleton, cls).__call__(*args, **kw)
return cls.__instances__[key]
super(Singleton, cls).__init__(name, bases, dictionary)
cls.__instances__ = {}
cls.__instantiate__ = instance_creator.__get__(cls, type(cls)) # bind instance_creator to cls
评论列表
文章目录