一、区别和联系
__new__是构造函数,在创建实例化对象时调用(触发),有一个必要的cls参数,代表当前类,__new__必须要有返回值。__init__是初始化函数,在创建实例化对象后调用(触发),有一个必要的self参数,代表当前实例对象,__init__不需要有返回值。总之,两者都在创建实例对象触发,__new__创建实例对象,__init__初始化实例对象的属性
二、__init__和__new__触发效果展示
class Test(object): def __new__(cls, *args, **kwargs): print("__new__被调用了") return super().__new__(cls) def __init__(self): print("__init__被调用了") super(Test,self).__init__() obj = Test()
__new__被调用了
__init__被调用了
三、__new__实现单例模式
cls本身没有_instance属性,所以我们声明了一个类属性_instance
class Alone_Model(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls) return cls._instance def __init__(self, name, age): self.name = name self.age = age obj = Alone_Model('bang',25) obj2 = Alone_Model('he',36) print(obj is obj2) # True print(id(obj),id(obj2)) # 内存地址一样 print(obj.name,obj2.name) # he,he obj2更新了初始化,由于单例模式,obj就是obj2,所以都打印的he,he