单例类: 让类创建的对象,在系统中只有唯一的一个实例
实现步骤:
- 1.定义一个类属性
__instance
,初始值是None,用于记录单例对象的引用 - 2.重写__new__方法
- 如果类属性
__instance is None
,调用父类方法分配空间,并在类属性中记录结果。 - 返回类属性中记录的对象引用
代码示例:
class MusicPlayer(object):
pass
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
可以看出两个对象对应不同内存地址,说明player1
,player2
是两个完全不同的对象,而在单例模式
下,对象被多次调用 ,得到的对象引用依然相同。
单例模式代码示例:
class MusicPlayer(object):
# 记录第一个被创建对象的引用
__instance = None
def __new__(cls, *args, **kwargs):
# 1.判断类属性是否为空
if cls.__instance is None:
# 2.调用父类方法,为第一个对象分配空间
cls.__instance = super().__new__(cls)
# 3.如果类属性有值,返回类属性保存的对象的引用
return cls.__instance
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
我们使用单例模式后,创建两个对象,对象的引用地址完全一样,达到了我们想要的结果。
只执行一次初始化工作
- 在每次使用
类名()
创建对象时,python的解释器都会调用两个方法 - 1)__new__分配空间
- 2)__init__对象初始化
通过重写__new__方法,我们实现了多次创建并对象时,只会得到第一次对象创建的引用,也就是__new__方法只会被调用一次,但是初始化方法__init__依然会被调用多次,接下来我们去实现让__init__只会被调用一次。
实现步骤:
- 定义一个类属性
__init__flag
标记,标记是否执行过初始化动作,初始值为False
- 在__init__方法中,判断
__init__flag
,如果为False
就执行初始化动作 - 然后将
__init__flag
设置为True
- 这样,再次自动调用__init__方法时,初始化动作就不会被再次执行了
代码示例:
class MusicPlayer(object):
# 记录第一个被创建对象的引用
__instance = None
def __new__(cls, *args, **kwargs):
# 1.判断类属性是否为空
if cls.__instance is None:
# 2.调用父类方法,为第一个对象分配空间
cls.__instance = super().__new__(cls)
# 3.如果类属性有值,返回类属性保存的对象的引用
return cls.__instance
def __init__(self):
print('初始化播放器')
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
我们可以看到上述代码,初始化方法被调用了多次。
初始化方法只执行一次代码示例:
class MusicPlayer(object):
# 记录第一个被创建对象的引用
__instance = None
__init__flag = False
def __new__(cls, *args, **kwargs):
# 1.判断类属性是否为空
if cls.__instance is None:
# 2.调用父类方法,为第一个对象分配空间
cls.__instance = super().__new__(cls)
# 3.如果类属性有值,返回类属性保存的对象的引用
return cls.__instance
def __init__(self):
# 1.判断是否执行过初始化动作
if self.__init__flag == False:
# 2.执行初始化动作
print('初始化播放器')
# 3.修改类属性标记
self.__init__flag = True
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)