单例设计模式
使用类名()创建对象时,python的解释器首先会调用new方法为对象
分配空间 new是一个由object基类提供的内置的静态方法,
主要有以下两个作用:
在内存中为对象分配空间
返回对象的引用
python的解释器获得对象的引用后,将引用作为第一个参数,
传递给init方法
new:负责给对象分配空间 init(初始化方法)负责给对象初始化
要求音乐播放器只能同时播放一首歌:
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 第一个参数 cls:哪一个类调用,就传递哪一个类
# 第二个参数 *args: 多值参数
# 第三个参数 **kwargs: 多值的字典参数
# 创建对象的时候,new方法会被自动调用
print '创建对象,分配空间'
def __init__(self):
print '播放器初始化'
player = MusicPlayer()
print player
因为没有为初始化对象分配空间,所以不执行‘播放器初始化’
class MusicPlayer(object):
#def __new__(cls, *args, **kwargs):
# 第一个参数 cls:哪一个类调用,就传递哪一个类
# 第二个参数 *args: 多值参数
# 第三个参数 **kwargs: 多值的字典参数
#print '创建对象,分配空间'
def __init__(self):
print '播放器初始化'
player = MusicPlayer()
print player
为初始化和新属性分配不同的属性:
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 第一个参数 cls:哪一个类调用,就传递哪一个类
# 第二个参数 *args: 多值参数
# 第三个参数 **kwargs: 多值的字典参数
# 创建对象的时候,new方法会被自动调用
# 重写了父类的方法
# 1.创建对象的时候,new方法会被自动调用
print '创建对象,分配空间'
# 2.为对象分配空间
instance = object.__new__(cls)
# 3.引用对象的返回
return instance
def __init__(self):
print '播放器初始化'
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2
单例:
让类创建的对象
在系统中只有唯一的一个实例
class MusicPlayer(object):
instance = None
def __new__(cls, *args, **kwargs):
# 第一个参数 cls:哪一个类调用,就传递哪一个类
# 第二个参数 *args: 多值参数
# 第三个参数 **kwargs: 多值的字典参数
# 创建对象的时候,new方法会被自动调用
if cls.instance is None:
cls.instance = object.__new__(cls)
return cls.instance
# 一个播放器只能同时播放一首歌
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2
只执行一次初始化工作
在每次使用 类名() 创建对象时,python 的解释器都会自动调用两个方法
new 分配空间
init 对象初始化
new方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次使用
需求:让初始化方法只执行一次:
class MusicPlayer(object):
instance = None
init_flag = False
def __new__(cls, *args, **kwargs):
# 第一个参数 cls:哪一个类调用,就传递哪一个类
# 第二个参数 *args: 多值参数
# 第三个参数 **kwargs: 多值的字典参数
# 创建对象的时候,new方法会被自动调用
if cls.instance is None:
cls.instance = object.__new__(cls)
return cls.instance
def __init__(self):
if MusicPlayer.init_flag:
return
print '初始化播放器'
MusicPlayer.init_flag = True
# 一个播放器只能同时播放一首歌
player1 = MusicPlayer()
print player1
player2 = MusicPlayer()
print player2