09 单例设计模式、__new__函数

隐身守侯 提交于 2019-12-02 02:08:33

设计模式

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

单例设计模式

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

单例设计模式的应用场景

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

__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:\python3\python3.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

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!