方式一:类的new方法


class Singleton(object):
    __instance=None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super().__new__(cls, *args, **kwargs)
        return cls.__instance


a = Singleton()
b = Singleton()
print(a == b)
print(id(a) == id(b))

方式二:装饰器

def singleton(cls):
    instances = {}

    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return getinstance


@singleton
class SingleCls(object):
    pass


# print(SingleCls)
a = SingleCls()
b = SingleCls()
print(a == b)
print(id(a) == id(b))

方式三:元类

class SingletonMeta(type):
    __instance = None

    def __call__(cls, *args, **kwargs):
        if not cls.__instance:
            # if not hasattr(cls.__instance):
            cls.__instance = type.__call__(cls, *args, **kwargs)
        return cls.__instance


class myclass(metaclass=SingletonMeta):
    def foo(self):
        pass

a = myclass()
b = myclass()
print(a == b)
print(id(a) == id(b))