欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python学习【第十篇】单例设计模式

程序员文章站 2022-04-04 15:36:45
单例设计模式 目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的。 __new__方法 使用类名创建对象时,python解释器首先会调用__new__方法为对象分配空间 __new__方法是有object基类提供的静态方法,主要作用有两个: 为内存中的对象分配空间 ......

单例设计模式

目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的。

 

__new__方法

使用类名创建对象时,python解释器首先会调用__new__方法为对象分配空间

__new__方法是有object基类提供的静态方法,主要作用有两个:

  • 为内存中的对象分配空间
  • 返回对象的引用,python解释器获得引用后会作为第一个参数返回给__init__方法

 

python中的单例:

  • __new__方法只创建一次空间,返回一次引用
  • __init___方法只初始化一次

所以,在python中实现单例需要重写__new__方法,python中重写__new__方法非常固定,必须要返回return super().__new__(cls),否则解释器就得不到对象的引用就不会调用初始化方法,如图:

python学习【第十篇】单例设计模式

 

python中单例的实现方式:

  • 定义一个 类属性,初始值是 None,用于记录 单例对象的引用
  • 重写__new__方法
  • 如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
  • 返回 类属性 中记录的 对象引用
  • 让初始化工作只执行一次

 

示例代码如下:

class Single(object):

    instance = None

    init_flag = False

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

        if cls.instance is None:

            cls.instance = super().__new__(cls)

        return cls.instance

    def __init__(self):

        if not Single.init_flag:

            print("初始化对象")

            Single.init_flag = True


s1 = Single()
s2 = Single()

print(s1)
print(s2)

  

执行结果:

初始化对象
<__main__.Single object at 0x7f4d032f1d68>
<__main__.Single object at 0x7f4d032f1d68>