面向对象-5-单例设计模式
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 创建对象时,new 方法自动被调用。
print('创建对象,分配空间')
def __init__(self):
print('初始化')
music= MusicPlayer()
print(music)
如果不使用返回值,那么是找不到地址的。而且,类属性没有运行。(初始化 未被打印)
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 创建对象时,new 方法自动被调用。
print('创建对象,分配空间')
return super().__new__(cls)
def __init__(self):
print('初始化')
music= MusicPlayer()
print(music)
class MusicPlayer(object):
pass
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)
创建不同对象时,地址是不同的。但是单例设计模式下,无论创建几个对象,地址都是相同的。如下所示:
class MusicPlayer(object):
instance = 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)
地址完全一样。
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
print('初始化')
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)
可以看见初始化了两次。但是我们只希望初始化一次。
class MusicPlayer(object):
instance = None
init_flage = 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_flage:
return
print('初始化')
MusicPlayer.init_flage = True
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)
初始化只执行了一次。