Python中__new__和__init__的区别与联系

Theo
Theo
发布时间:2026-10-12 | 2人浏览过
原创

本文详细解析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__的区别与联系,请参阅以下相关链接

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表