# 首先了解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方法里返回的都是第一个实例化对象 # 都指向的第一个实例化的内存地址,所以不管以后实例化多少个对象,都是同一个内存地址里的同一个东西