方式一:装饰器函数
def Singleton(cls):
instance = {}
def wrapper(*args, **kargs):
if cls not in instance:
instance[cls] = cls(*args, **kargs)
return instance[cls]
return wrapper
@Singleton
class SingletonTest(object):
def __init__(self, name):
self.name = name
s1 = SingletonTest('1')
s2 = SingletonTest('2')
print(id(s1) == id(s2))
方式二:装饰器类
class Singleton(object):
def __init__(self, cls):
self.cls = cls
self.instance = {}
def __call__(self, *args, **kwargs):
if self.cls not in self.instance:
self.instance[self.cls] = self.cls
return self.instance[self.cls]
@Singleton
class SingletonTest(object):
def __init__(self, name):
self.name = name
s1 = SingletonTest('1')
s2 = SingletonTest('2')
print(id(s1) == id(s2))
方式三:__new__
class Singleton:
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in cls.instance:
cls.instance[cls] = cls
return cls.instance[cls]
def __init__(self, name):
self.name = name
s1 = Singleton('1')
s2 = Singleton('2')
print(id(s1) == id(s2))
方式四:元类
class SingletonType(type):
instance = {}
def __call__(cls, *args, **kwargs):
if cls not in cls.instance:
cls.instance[cls] = super().__call__(*args, **kwargs)
return cls.instance[cls]
class Singleton(metaclass=SingletonType):
def __init__(self, name):
self.name = name
s1 = Singleton('1')
s2 = Singleton('2')
print(id(s1) == id(s2))