zoukankan      html  css  js  c++  java
  • 09 单例设计模式、__new__函数

    设计模式

    • 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题成熟的解决方案
    • 使用设计模式是为了可重用代码、让代码更容易的被他人理解、保证代码的可靠性。

    单例设计模式

    • 单例即指只有一个实例
    • 目的:让该类创建的对象,在系统中只有一个实例
    • 每一次创建此类的对象,内存地址都是相同的

    单例设计模式的应用场景

    • 音乐播放 对象
    • 回收站对象
    • 打印机对象
    • 。。。

    __new__函数

    • __new_函数是一个内置函数,用来创建一个实例,在内存中为它开辟一个空间,并返回内存地址

    单例模式的思路

    • 定义一个类属性,用以接收实例的地址
    • 拓展__new__函数,判断定义的类属性,如果为空,则调用super().__new__并用类属性接收它返回的地址,然后返回该类属性
    • 如果类属性,则直接返回类属性
    • 这样无论创建多少个对象,他们都指向同一个内存空间,也就是只有一个实例。

    单例模式演示

    class MusicPlayer(object):
        instance = None #用以接收对象的内存地址
        init_flag = False #判断__init__()用以标记函数有没有被执行过
        def __new__(cls, *args, **kwargs):
            if cls.instance is None:
                cls.instance = super().__new__(cls)  # 因为是拓展__new__方法所以必须要执行一次super().__new__,本次执行时创建一个对象(分配内存空间)并返回对象的地址
            return cls.instance
        # 在单例模式中,一般都会让init方法只被执行一次
        def __init__(self):
            if MusicPlayer.init_flag:
                return
            MusicPlayer.init_flag = True
            print("被执行了一次")
    
    # 创建多个对象
    player1 = MusicPlayer()
    player2 = MusicPlayer()
    
    # 发现两个地址不一样
    print(player1)
    print(player2)
    

      运行结果,可以看到两个实例的地址完全相同:

    E:python3python3.exe F:/PycharmProjects/project3-class/xh_21_单例模式:音乐播放.py
    被执行了一次
    <__main__.MusicPlayer object at 0x0000000001DF25B0>
    <__main__.MusicPlayer object at 0x0000000001DF25B0>
    
    Process finished with exit code 0
    

      

    __new__()与__init__()的区别

    • 前者只负责创建实例的空间,返回空间地址
    • 后者为该对象初始化实例属性

    其它

    请务必检测单码是否足够简单,如if代码可写为:

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

      

  • 相关阅读:
    团队项目冲刺七
    团队项目冲刺六
    团队项目冲刺5
    团队项目冲刺4
    团队项目测试计划
    团队项目冲刺第三天进度和遇到问题
    团队项目冲刺第二天进度和问题
    博客园用户体验
    团队项目冲刺第一天进度和问题
    团队项目风险
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/11725244.html
Copyright © 2011-2022 走看看