方式一:装饰器函数
 
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))