• python使用__new__创建一个单例模式(单例对象)


    #单例模式:使一个类只产生一个对象。他们的id地址都指向同一个内存地址

    第一步:理解谁创建了对象

    # 单例模式
    # 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object
    # 然后调用这个objectnew方法来创建一个对象。
    # 创建对象后,才会执行__init__方法,进行初始化


    # 第一步:
    class Person:
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            print("1111")
    
        def __init__(self):
            print("创建对象后,进行初始化")
    
    p = Person()  #结果 1111
    #从结果分析:我自己创建的这个new方法,会先执行我自己的new方法,但是并没有产生对象(因为没有执行__init__方法)
    # 我们创建对象的时候,是object这个原类帮助我们产生了对象。所以我们要调用父类(object)的new方法来产生一个对象。

    第二步理解对象的执行顺序:

    # 因此:下面的这个方法才能帮助我们产生一个对象

    class Person:
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            print(111)
            obj=object.__new__(cls)  # 传入我们要产生对象的这个类
            return obj
    
        def __init__(self):
            print("创建对象后,进行初始化")
    
    
    p1=Person()
    # 111
    # 创建对象后,进行初始化
    
    '''
    结果分析:
    我调用了objcet的__new__方法,帮助我产生了一个对象,并且这个对象也执行了__init__方法。
    
    '''

    第三步:理解怎么才能只创建一个对象,通过什么条件来只创建一个对象

    # 通过上面两个的案例理解。我知道了我应该调用父类的new方法来创建一个对象,
    并且我希望这个,再次创建对象的时候,创建的对象还是刚开始创建的那个对象。
    所以我希望用定义的私有变量来做个判断,如果私有变量__instance有值 我则直接
    返回刚开始创建的那个对象。如果没有创建,则调用父类new方法创建一个对象。
    class Person:
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            print("1111")
            if Person.__instance is None:  # 只有第一次的时候,条件是None,所以第一次的时候才创建一个对象,后面的条件都不是false,所以直接返回第一次创建的对象
                obj = object.__new__(cls)  # 继承调用object的new方法产生一个对象
                Person.__instance = obj     # 将这个对象赋值给这个类的私有变量__instance
    
            return Person.__instance
    
        def __init__(self):
            print("创建对象后,进行初始化")
    
    
    p1 = Person()
    p2 = Person()
    p3 = Person()
    p4 = Person()
    print(id(p1),id(p2),id(p3),id(p4))
    
    输出结果:显示4个对象的内存地址都一样
    416664513336 416664513336 416664513336 416664513336
    
    
    
     
  • 相关阅读:
    邻接表
    分治
    当遇到error: stray '241' in program错误的解决方法
    cmd / msys2 添加到右菜单
    洛谷P1003 铺地毯
    【洛谷P3372】【模板】线段树 1
    【codevs1082】线段树练习 3
    【codevs1081】线段树练习 2
    【codevs1080】线段树练习1
    【洛谷P1731】生日蛋糕
  • 原文地址:https://www.cnblogs.com/one-tom/p/11264501.html
Copyright © 2020-2023  润新知