Python中__new__和__init__的区别与联系
本文详细解析Python中__new__与__init__方法的差异与协作机制。__new__负责创建实例并返回对象,__init__负责初始化实例属性。文章通过代码示例说明两者调用顺序、返回值影响及继承场景下的行为,帮助开发者深入理解Python对象创建流程。
__new__ 和 __init__ 的核心差异在于职责分工:
__new__ 专门用于创建对象实例,而 __init__ 则专注于对已创建的实例进行初始化操作。
__new__ 在对象创建阶段被调用,其作用是返回当前类的一个实例。
__init__ 在对象创建完成后被调用,用于对当前实例进行初始化设置,该方法不返回任何值。
1. 当类中同时定义了__new__和__init__时,系统会优先执行__new__方法。
class ClsTest(object): def __init__(self): print("init") def __new__(cls,*args, **kwargs): print("new")ClsTest()
输出结果如下:
new
2. 若__new__正确返回了当前类的实例,Python解释器将隐式调用__init__。
具体代码示例如下:
class ClsTest(object): def __init__(self): print ("init") def __new__(cls,*args, **kwargs): print ("new %s"%cls) return object.__new__(cls, *args, **kwargs)ClsTest()
运行输出为:
new <class '__main__.ClsTest'>init
3. __new__ 方法必须返回构造好的对象,而 __init__ 不返回任何值。
class ClsTest(object): def __init__(cls): cls.x = 2 print ("init") return clsClsTest()
执行输出显示:
initTraceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: __init__() should return None, not 'ClsTest'
4. 如果__new__未能正确返回当前类cls的实例,即使该实例是父类的,__init__也不会被调用。
class ClsTest1(object): passclass ClsTest2(ClsTest1): def __init__(self): print ("init") def __new__(cls,*args, **kwargs): print ("new %s"%cls) return object.__new__(ClsTest1, *args, **kwargs)b=ClsTest2()print (type(b))
程序输出如下:
new <class '__main__.ClsTest2'>
<class '__main__.ClsTest1'>
关键知识点总结:
1. 只有继承自object的新式类才具备__new__方法。
2. __new__至少需要接收一个参数cls,代表待实例化的类,该参数由Python解释器在实例化时自动传入。__new__必须返回一个实例,可以是调用父类__new__生成的实例,也可以是直接调用object的__new__生成的实例。
3. __init__接收一个参数self,即由__new__返回的实例。__init__在__new__的基础上完成其他初始化工作,且不需要返回值。
4. 当__new__返回当前类的实例时,系统会隐式调用__init__进行后续初始化。
如需了解更多Python中__new__和__init__的区别与联系,请参阅以下相关链接
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









