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

2018-06-18 03:16:48来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

单例设计模式

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

 

__new__方法

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

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

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

 

python中的单例:

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

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

 

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>

  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Django Rest Framework源码剖析(六)-----序列化(serializers)

下一篇:Anaconda创建python(2.7/3.6)的虚拟环境后需要添加ipykernel