zoukankan      html  css  js  c++  java
  • 单例模式的理解

    # 首先了解object类实例化对象时候使用new的时候发生了什么
    # class Person():
    #     def __init__(self):
    #         print('这是init方法')
    #
    #
    # a = Person()     # 不重写object的new方法不采用单例化模式的时候,则每实例化一个对象
    # b = Person()     # object的new方法会创建一块内存地址去存储这个实例化对象
    # print(id(a))     # 所以每个实例化对象的内存地址都是不一样的,分别会调用init初始化方法,初始化
    # print(id(b))
    
    # 其次在子类中重写new方法
    class Person(object):
        zheshibenshen = None
        def __new__(cls):
            if cls.zheshibenshen == None:
                cls.zheshibenshen = super().__new__(cls)
            return cls.zheshibenshen
    
        def __init__(self):
            print('这是init方法')
    
    
    a = Person()     # 这里重写了父类object的new方法,使这个类每次实例化对象的时候总是返回zheshibenshen(即它自己)
    b = Person()     # 第一次实例化时,这里就是重新调用object的new方法,创建一个内存地址存放实例对象
                     # 不重写new,object也会执行super().__new__(Person)这个方法,创建一个内存地址存放实例
    print(id(a))     # 然后再把它赋值给zheshibenshen然后返回它,它们其实就是这个类第一次实例化时的对象
    # # 到这里为止跟不重写new方法时的过程是一样的,重点是后面这个类再去实例化对象的时候
    # # 也就是说以后再实例化对象的时候,每次new都会判断这个实例化的对象,它自己是不是空,不是空就返回它自己
    print(id(b))     # 所以每次实例化对象的时候,(重写后)每次new方法里返回的都是第一个实例化对象
                     # 都指向的第一个实例化的内存地址,所以不管以后实例化多少个对象,都是同一个内存地址里的同一个东西
    

      

                                                                       -------  知识无价,汗水有情,如需搬运请注明出处,谢谢!

  • 相关阅读:
    P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
    P3389 【模板】高斯消元法
    P2260 [清华集训2012]模积和
    【Codevs1237&网络流24题】餐巾计划(费用流)
    【POJ3680】Intervals(费用流)
    【BZOJ1070】修车(费用流)
    【BZOJ1834】network 网络扩容(最大流,费用流)
    【POJ1149&BZOJ1280】PIGS(最大流)
    【BZOJ2127】happiness(最小割)
    【BZOJ3894】文理分科(最小割)
  • 原文地址:https://www.cnblogs.com/wf-skylark/p/9009453.html
Copyright © 2011-2022 走看看