Python3之单例浅谈

日期:2020年2月15日
作者:Commas
注释:学习就是为了忘记,接上一章《Python3之面向对象小结》,现在讲一下单例;
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》



一、聊一聊单例是什么

单例,从字面上理解,一个唯一的实例。在某些情况,我们或许不需要更多的实例,比如视频播放器,那么就需要使用单例设计模式来只允许获得唯一的一个实例对象。
那么如何实现呢?实际上很简单,就是无论多少次类实例化对象的时候,都只返回一个相同的内存地址,保证实例对象的内存地址是相同的,从而保证只有一个实例对象,实现的大致思路如下:

  1. 首次实例对象,使用Object基类中的__new__()内置静态方法,为对象分配内存地址,以后都不再为实例重新分配内存空间;
  2. 实例对象属性只需要初始化一次,所以在内置方法__init__()中做相应的判断;

二、举一举单例的示例

class MoviePlayer:
    """Python3类都会自动继承Obiect类"""

    # 定义类属性记录单例对象引用
    # 若不为None,则已经创建了一个实例,
    # 将不再为对象重新申请分配内存空间,实现单例(唯一的一个实例)
    instance = None

    # 用来记录实例初始化情况
    is_init = False

    def __new__(cls, *args, **kwargs):
        """
        【object内置静态方法】:调用时,需要主动传递cls参数
        1、为对象分配内存空间
        2、返回对象引用
        """
        print("调用__new__方法")
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        print(cls.instance)
        return cls.instance

    def __init__(self):
        """
        1、实例对象初始化
        2、定义实例属性
        """

        # 因为单例,所以实例对象只需要被初始化一次
        # 我们只要判断是否有实例是否已创建
        if MoviePlayer.is_init:
            return
        # 标记已经初始化
        MoviePlayer.is_init = True
        print("调用__init__方法,进行对象实例初始化")


player = MoviePlayer()
print(player)

print("="*20)

player1 = MoviePlayer()
print(player1)
控制台输出:
调用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
调用__init__方法,进行对象实例初始化
<__main__.MoviePlayer object at 0x0000023C59041518>
====================
调用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
<__main__.MoviePlayer object at 0x0000023C59041518>

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104328551

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值