Python-面向对象编程-单例

111 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

1. 单例

单例:让类创建的对象,在系统中只有唯一的一个实例

  1. 定义一个类属性,初始值是None,用于记录单例对象的引用
  2. 重写__new__方法
  3. 如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
  4. 返回类属性中记录的对象引用 如果内存地址是相同的,说明多次调用的方法本质上还是同一个对象

要想实现单例,第一步在类中定义一个类属性。这个类属性保存住第一个被创建出来的对象引用。

2. 案例演示

代码演示如下所示:在new方法内部,我们判断类属性是否被设置值,如果没设置,我们就调用父类方法为第一个对象分配空间。如果类属性已经有了值,我们直接把类属性保存的第一个对象引用直接返回。这样,在外界无论调用多少次创建对象的方法得到的对象内存地址永远都是相同的。

当我们调用父类方法为这个对象分配空间的时候,类属性记录父类方法的返回结果,父类方法的返回结果是第一个对象在内存中的地址,当我们再次调用创建对象的这个方法时,再次创建,第一个对象在内存中已经存在了,把第一个对象的引用做一个返回。之后不再调用父类的分配空间的这个方法,就不会在内存中为这个类的其他对象分配空间,而再次调用时只是把之前第一个对象的引用做一个返回。因此,无论我们多少次调用创建对象的方法,我们得到的永远是第一个创建对象出来的引用

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)

运行结果如下图所示:

image.png