只执行一次初始化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)

运行结果如下:
在这里插入图片描述
可以看出:初始化方法还是会被多次调用

那么要怎么样才能让初始化动作只被执行一次呢??
解决办法(两者思路很像):

  1. 定义一个类属性init_flag标记是否执行过初始化动作,初始值为false
  2. __init__方法中,判断init_flag,如果为false就执行初始化操作
  3. 然后将init_flag设置为Ture
  4. 这样,再次调用__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)

运行结果如下:
在这里插入图片描述
可以看出,初始化动作只执行了一次

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐