面向对象-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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值