#单例模式:使一个类只产生一个对象。他们的id地址都指向同一个内存地址
第一步:理解谁创建了对象
# 单例模式
# 首先明白,我们在创建一个类的对象的时候,其实是调用的这个类的父类,即继承object,
# 然后调用这个object的new方法来创建一个对象。
# 创建对象后,才会执行__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