__new__(cls)方法详解

只要是面向对象的编程语言,类的实例化一定包含两个步骤:
(1)在内存中创建对象,即开辟一块内存空间来存放类的实例化对象(Instance);
(2)初始化对象,即给实例的属性赋予初始值。

构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;
__new__是在实例创建之前被调用的,它的任务是创建实例然后返回该实例
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

__new__在__init__之前被调用,__new__的返回值(obj)将传递给__init__方法的第一个参数(self),然后__init__给这个实例设置一些参数,__init__不需要返回值


如果__new__方法返回None,则__init__方法不会被执行,所以__new__必须要有返回值。除此以外,创建obj时只能调用父类中的__new__方法(如object),而不能调用毫无关系的类的__new__方法。


__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,也可手动添加

 

我们可以将类比画画,__new__方法提供一张白纸,__init__方法在纸上画画,但归根到底是同一张纸

复制代码
class Foo():
    def __new__(Foo, age,name):
        obj=super().__new__(Foo)
        print('obj 的id:',id(obj))
        print(obj.__dict__)
        return obj
    def __init__(self,age,name):
        print(self.__dict__)
        self.age=age
        self.name=name
        print(self.__dict__)
        print('self的id:',id(self))

f1=Foo(100,'yyy')
print('f1  的id:',id(f1))
print(f1.__dict__)
复制代码

打印结果:

obj 的id: 2867407950352
{}
{}
{'age': 100, 'name': 'yyy'}
self的id: 2867407950352
f1 的id: 2867407950352
{'age': 100, 'name': 'yyy'}

 

posted @   Junior_bond  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示