# __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)