一文读懂Python中__new__和__init__的区别与联系
发布时间:2025-09-24 11:03:14
__new__ 和 __init__ 主要表现为:
它本身的区别;
Python中新旧类的定义。
__new__ 创建负责对象,而 __init__ 负责人的初始化。
__new__:在创建对象时,调用将返回当前对象的一个例子
__init__:创建对象后,对当前对象的一些实例进行初始化,没有返回值
1. 在类中,如果___new__和__init__同时存在,将优先调用__new__
classClsTest(object): def__init__(self): print("init") def__new__(cls,*args,**kwargs): print("new") ClsTest()
输出
new
2. 如果__new__回到一个对象的例子,会隐式调用__init__
代码实例:
classClsTest(object): def__init__(self): print("init") def__new__(cls,*args,**kwargs): print("new%s"%cls) returnobject.__new__(cls,*args,**kwargs) ClsTest()
输出
new<class'__main__.ClsTest'> init
3. __new__方法将返回构造对象,__init____不会。____init__无返回值。
classClsTest(object): def__init__(cls): cls.x=2 print("init") returncls ClsTest()
输出
init Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> TypeError:__init__()shouldreturnNone,not'ClsTest'
4. 若__new______________________init___不会被调用,即使是父类的例子也不行
ClsTest11Class(object): pass clasclstest2(clstest1): def__init__(self): print("init") def__new__(cls,*args,**kwargs): print("new%s"%cls) returnobject.__new__(Clstest1,*args,**kwargs) b=Clstest2() print(type(b))
输出
new<class'__main__.Test2Cls#39;> <class'__main__.clstest1'>
总结
1. 只有继承object的新类才有__new__
2. __new_________________________new___必须有返回值,返回实例化的例子可以是return父类__new__出来的例子,或者直接是object__new__出来的例子
3. __init__有一个参数self,就是这个__new___回来的例子,___init__在__new_________________init__不需要返回值
4. 如果__new__回到一个对象的例子,会隐式调用__init__。