一、概念

单例是让类创建的对象在系统中只有唯一的一个实例,每一次这些类名()返回的对象内存地址都是相同的。

比如音乐播放器对象、视频播放对象等都是单例模式。

二、__new__方法

使用类名()创建对象时,会调用__new__方法分配空间,并返回对象的引用。Pyton获取对象的引用后,将引用作为第一个参数,传递给__init__方法。重写__new__方法一定要return super().new(cls)。否则Python得不到分配律空间的对象引用,就不会调用对象的初始化方法。

代码示例如下:

class MoviePlayer:
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)

    def __int__(self):
        print("初始化视频播放器")


player = MoviePlayer()

print(player)

三、单例

让类创建对象时,系统中只有唯一一个实例。

步骤:

1.定义一个类属性、初始值是None,用于记录单例对象

2.重写__new__方法

3.如果类属性为None,调用父类方法分配空间,并在类属性中记录结果

4.返回类属性中记录的对象引用

代码示例如下:

class MoviePlayer:
    # 定义类属性记录单例对象引用
    instane = None
    def __new__(cls, *args, **kwargs):
        # 判断类属性是否已经有值
        if cls.instane is None:
            cls.instane = super().__new__(cls)
        #返回类属性的单例引用
        return cls.instane

player1 = MoviePlayer()
print(player1)

player2 = MoviePlayer()
print(player2)

输出:

<__main__.MoviePlayer object at 0x00000000021A47F0>
<__main__.MoviePlayer object at 0x00000000021A47F0>