python中的单例模式,是利用基类object的内置__new__()静态方法,对其重写实现的。
因为Python在实例化对象前,会干2件事:调用__new__()为实例开辟内存空间,
同时返回内存空间地址(也就是对象的引用)作为__init__(self)的参数完成对象的初始化。
故解决方案:
第一步:定义类属性instance,设置其初始值为None,用于记录创建的对象(解释器为我们做的第一步:分配内存空间)
第二步:重写静态方法,在方法内部判断类属性是否为None,为None就调用父类的__new__()静态方法。否则直接返回类属性
第三步:在定义一个类属性init_flag,默认设置为False(用于判断是否第一次初始化。这样避免同一个对象重复初始化)
第四步:在__init__()内判断:init_flag是否为False,如果是,则为对象初始化。否则直接return
详细代码:
class MusicPlayer(object):
instance = None
init_flag = False
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
else:
return cls.instance
def __init__(self):
if MusicPlayer.init_flag:
return
else:
print("播放器初始化...")
MusicPlayer.init_flag = True
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)
结果:
播放器初始化...
<__main__.MusicPlayer object at 0x00000186A3E43CF8>
<__main__.MusicPlayer object at 0x00000186A3E43CF8>