__new__和__init__方法有什么区别?

来源:个人站长作者:乙爱丽丝头衔:网络博主
导读:本期聚焦于小伙伴创作的《__new__和__init__方法有什么区别?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《__new__和__init__方法有什么区别?》有用,将其分享出去将是对创作者最好的鼓励。

在Python面向对象编程体系中,__new__和__init__都是类中用于对象创建的特殊方法,但二者的定位和作用存在本质区别,理解它们的差异是掌握Python对象实例化流程的关键。

__new__和__init__方法有什么区别?

执行顺序差异

对象实例化的过程中,__new__方法会先于__init__方法执行。__new__负责创建对象实例,而__init__负责对已经创建好的实例进行初始化赋值。

我们可以通过简单的打印日志验证执行顺序:

class Demo:
    def __new__(cls, *args, **kwargs):
        print("执行__new__方法")
        # 调用父类的__new__方法创建实例
        return super().__new__(cls)

    def __init__(self, value):
        print("执行__init__方法")
        self.value = value

# 实例化对象
obj = Demo(10)

运行上述代码后,输出结果会先显示执行__new__方法,再显示执行__init__方法,直观体现了两者的执行先后关系。

返回值的区别

__new__方法必须返回一个实例对象,这个对象就是后续会被__init__处理的实例。如果__new__没有返回有效实例,__init__方法不会被调用。

而__init__方法不需要返回值,它的职责是初始化实例的属性,即使返回了内容也不会被Python解释器处理。

下面的示例展示了__new__不返回实例时的情况:

class Demo2:
    def __new__(cls, *args, **kwargs):
        print("__new__执行,但没有返回实例")
        # 没有返回实例

    def __init__(self, value):
        print("__init__执行")
        self.value = value

obj2 = Demo2(20)

运行代码后只会打印__new__相关的输出,__init__方法不会被执行,因为__new__没有返回有效实例。

参数与重写场景差异

__new__方法的第一个参数是cls,代表当前类本身,通常用于返回类的实例;__init__方法的第一个参数是self,代表已经创建好的实例对象。

重写__new__的常见场景是实现单例模式、不可变类型(如int、str)的自定义子类等,而重写__init__的场景更多是对实例属性进行初始化赋值。

以下是用__new__实现单例模式的示例:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, name):
        self.name = name

s1 = Singleton("a")
s2 = Singleton("b")
# 两个实例是同一个对象
print(s1 is s2)  # 输出True
print(s1.name)   # 输出b,因为两次实例化都是同一个对象,后初始化的属性会覆盖之前的

核心差异总结

我们可以通过表格更清晰地对比两者的核心差异:

对比维度__new__方法__init__方法
执行顺序先执行后执行
核心职责创建对象实例初始化实例属性
返回值要求必须返回实例对象无返回值要求
第一个参数cls(类本身)self(已创建的实例)
典型重写场景单例模式、不可变类型子类实例属性初始化

总的来说,__new__是对象创建阶段的入口,__init__是对象初始化阶段的入口,二者配合完成了Python对象的实例化流程,在需要自定义对象创建逻辑时,优先考虑重写__new__,常规属性初始化则重写__init__即可。

__new____init__Python面向对象修改时间:2026-07-21 09:48:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。