Python中__new__和__init__的区别与联系

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

本文详细解析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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。