方式一:类的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))