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
 

 

猜你喜欢

转载自www.cnblogs.com/one-tom/p/11264501.html