面向对象-5-单例设计模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):

        # 创建对象时,new 方法自动被调用。
        print('创建对象,分配空间')

    def __init__(self):
        print('初始化')

music= MusicPlayer()

print(music)

在这里插入图片描述
如果不使用返回值,那么是找不到地址的。而且,类属性没有运行。(初始化 未被打印)

class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):

        # 创建对象时,new 方法自动被调用。
        print('创建对象,分配空间')

        return super().__new__(cls)

    def __init__(self):
        print('初始化')

music= MusicPlayer()

print(music)

在这里插入图片描述

class MusicPlayer(object):

    pass

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)

在这里插入图片描述
创建不同对象时,地址是不同的。但是单例设计模式下,无论创建几个对象,地址都是相同的。如下所示:

class MusicPlayer(object):

    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)

在这里插入图片描述
地址完全一样。
在这里插入图片描述

class MusicPlayer(object):

    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

    def __init__(self):
        print('初始化')

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)

在这里插入图片描述
可以看见初始化了两次。但是我们只希望初始化一次。

class MusicPlayer(object):

    instance = None

    init_flage = False

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

    def __init__(self):

        if MusicPlayer.init_flage:
            return

        print('初始化')

        MusicPlayer.init_flage = True

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)

在这里插入图片描述
初始化只执行了一次。

猜你喜欢

转载自blog.csdn.net/sundanping_123/article/details/89244823