python 单例模式


# __new__

class Demo:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):
            cls._instance=super().__new__(cls)
        return cls._instance

a=Demo()
b=Demo()
print(id(a),id(b))


# 元类 type

class Demo(type):
    def __init__(cls,*args,**kwargs):
        cls._instace=None
        super().__init__(*args,**kwargs)

    def __call__(cls, *args, **kwargs):
        if cls._instace is None:
            cls._instace=super().__call__(*args,**kwargs)
        return cls._instace

class D(metaclass=Demo):
    pass
a=D()
b=D()
print(a is b)


# 装饰器
def demo(cls):
    instance={}
    def g_instance(*args,**kwargs):
        if cls not in instance:
            instance[cls]=cls(*args,**kwargs)
        return instance[cls]
    return g_instance


@demo
class D:
    pass

a=D()
b=D()
print(a is b)