Python中__new__与__init__的核心区别与正确用法

沈知远
沈知远
发布时间:2026-10-12| 1人浏览过
原创

本文详细解析Python中__new__与__init__的作用差异、执行顺序及关键注意事项。通过对比标准写法与常见错误案例,说明如何通过重写__new__方法控制实例创建流程,并强调返回值对__init__触发的决定性影响,帮助开发者避免初始化失败问题。

核心机制:创建与初始化的分工

在Python实例化过程中,对象的生命周期被明确拆分为两个阶段,分别由两个魔术方法承担:
__new__负责分配内存并创建实例对象,属于类级别的静态行为。
__init__负责接收已生成的实例,执行属性赋值等初始化逻辑。

两者的执行顺序固定为先__new__后__init__。由于Python中任何类默认均继承于object类(原稿中class Person(object):为显式声明,便于理解继承链),系统默认调用父类的__new__生成实例后,会自动将该实例作为首参传入__init__。常规业务逻辑无需干涉实例创建,仅在单例模式、不可变类型定制或元类开发时才会覆写该方法。

实战操作:正确覆写与参数传递

第1步:编写基础类结构与初始化逻辑

目的:定义待初始化的属性字段,并加入日志打印以便追踪执行流。入口位于类定义内部,接收name、id、sex参数。

class Person(object):
    def __init__(self, name, id, sex):
        self.name = name
        self.id = id
        self.sex = sex
        print("初始化对象的值")

第2步:实现安全的__new__方法

目的:手动委托父类进行内存分配,并将生成的实例完整返回。必须使用super().__new__(cls)获取新实例,随后执行return。此举确保了__init__能接收到有效的实例上下文。

    def __new__(cls, *args, **kwargs):
        print("开始创建对象,并分配内存")
        self = super().__new__(cls)
        return self

if __name__ == '__main__':
    p = Person("张三", 12, "男")

排错指南:缺失返回值的连锁反应

若__new__方法中遗漏了返回语句,Python解释器会判定实例创建失败,直接终止后续流程,导致__init__完全静默不执行。以下是典型错误写法:

# 错误示范:未返回对象
    def __new__(cls, *args, **kwargs):
        print("开始创建对象,并分配内存")
        # 遗漏 return self

运行该代码片段时,控制台仅输出前半段日志,后续初始化步骤被跳过。排查此问题时,优先核对__new__末尾是否返回了实例引用。修正后即可看到完整的执行链条:

开始创建对象,并分配内存
初始化对象的值

简要总结

以上就是Python中__new__与__init__区别的详细内容,更多关于Python面向对象编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

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 算法库。