__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'}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)