单例模式, 是设计模式的一种, 适用于只需要一个实例的类, 比如音乐播放器
class MusicPlayer(object):
#单例模式的对象引用
instace = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1) #得到的地址相同, 是同一个对象
print(player2)
程序输出结果如下:
<__main__.MusicPlayer object at 0x000002A2A00A5F28>
<__main__.MusicPlayer object at 0x000002A2A00A5F28>
关于 __new__
此内置方法, 是在创建对象时, 自动被调用, 默认返回的是super().__new__(cls)
只需要把第一次创建的对象地址保存到类属性中, 后续返回此地址即可
一次初始化
虽然单单例对象只会创建一个, 但会多次初始化, 如果想要初始化一次, 可参考如下
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
def __init__(self):
if MusicPlayer.init_flag:
return
MusicPlayer.init_flag=True
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1) # 得到的地址相同, 是同一个对象
print(player2)