zoukankan      html  css  js  c++  java
  • 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
    
    
    
     
  • 相关阅读:
    Adobe Illustrator CS6 界面文字按钮太小,高分屏win10PS/AI等软件界面字太小解决方法
    暗网,又称深网。据估计,暗网比表面网站大几个数量级。
    HexDump.java解析,android 16进制转换
    excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
    小黄人IP营销的四种玩法思维导图
    Window下PHP三种运行方式图文详解,window下的php是不是单进程的?
    全球海底光缆分布图
    redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存
    图解人工智能机器学习深度学习的关系和区别
    B轮公司技术问题列表
  • 原文地址:https://www.cnblogs.com/one-tom/p/11264501.html
Copyright © 2011-2022 走看看