(第三篇)__new__和__init__

发布时间 2023-03-24 15:49:36作者: hechengQAQ

一、区别和联系

__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