单例
类创建的对象,在系统中只有唯一的一个实例。
new方法
new方法是object这个基类提供的类方法。
- 在内存中为对象分配存储空间
- 返回对象的引用给解释器
注意:
- 重写new方法一定要return super().__new__(cls)
- 否则python解释器得不到分配了存储空间的引用对象,就不会调用对象的初始化方法
- new方法是一个类方法,在调用时需要主动传入cls参数
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 1. 创建对象时,new方法会被自动调用
print("创建对象,分配存储空间")
# 2. 为对象分配空间
instance = super().__new__(cls)
# 3.返回对象的引用
return instance
def __init__(self):
print("播放器初始化")
# 创建对象播放器对象
player = MusicPlayer()
print(player)
单例定义
- 定义一个类属性,初始值时None,用于记录单例对象的引用
- 重写new方法
- 如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果
- 返回类属性中记录的对象引用
让初始化动作只执行一次
- 定义一个类属性init_flag,标记是否执行过初始化动作,初始值为False
- 在init方法中,判断init_flag是否为False,如果为False则执行初始化
- 让后将init_flag设置为True
- 这样再次执行创建对象的操作时,初始化动作就不会再执行了
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 MusicPlayer.init_flag:
return
# 2. 如果没有执行过,再执行初始化动作
print("初始化播放器")
# 3. 修改类属性的标记
MusicPlayer.init_flag = True
# 创建对象播放器对象
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1, player2)
网友评论