单例就是解决在内存中始终只有一个实例对象的问题,在python中实现起来很简单,python中是通过new函数来分配内存的,举个栗子
class MusicPlayer:
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
m1 = MusicPlayer()
m2 = MusicPlayer()
print(id(m1), id(m2))
这样就实现了单例的需求,但是有一个问题,如果类里面显示书写了init函数,当创建m1,m2的时候就会调用两次初始化函数
怎么解决呢,也比较简单,如下
class MusicPlayer:
instance = None
init_flat = False
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
if MusicPlayer.init_flat:
return
print("-----init-----")
MusicPlayer.init_flat = True
m1 = MusicPlayer()
m2 = MusicPlayer()
print(id(m1), id(m2))
这样就ok了