python中如何只执行一次初始化init工作
·
只执行一次初始化init工作:
这篇文章:python中的单例:让类创建的对象,在系统中只有唯一的一个实例
讲到了对__new__进行改造后,每次都会得到第一次被创建对象的引用
但是:初始化方法还是会被多次调用
代码如下:
class MusicPlayer(object):
#记录第一个被创建对象的引用
instance = None
def __new__(cls, *args, **kwargs):
#1.判断类属性是否为空对象,若为空说明第一个对象还没被创建
if cls.instance is None:
#2.对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
#3.把类属性中保存的对象引用返回给python的解释器
return cls.instance
def __init__(self):
print("初始化init")
#创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
运行结果如下:

可以看出:初始化方法还是会被多次调用
那么要怎么样才能让初始化动作只被执行一次呢??
解决办法(两者思路很像):
- 定义一个类属性
init_flag标记是否执行过初始化动作,初始值为false - 在
__init__方法中,判断init_flag,如果为false就执行初始化操作 - 然后将
init_flag设置为Ture - 这样,再次调用
__init__方法时,初始化就不会再次被执行了
修改后代码如下:
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.把类属性中保存的对象引用返回给python的解释器
return cls.instance
def __init__(self):
#1.判断是否执行过初始化动作,若执行过,直觉return
if MusicPlayer.init_flag:
return
#2.若没执行过,再执行初始化动作
print("初始化init")
#修改类属性的标记
MusicPlayer.init_flag = True
#创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
运行结果如下:

可以看出,初始化动作只执行了一次
更多推荐



所有评论(0)