You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类中__new__方法的作用、返回值及去向疑问

搞懂Python里的__new__:返回什么?去哪了?

先明确核心逻辑:当你调用MyClass()创建实例时,Python会先执行__new__,再执行__init__——前提是__new__返回的是当前类的实例。

__new__返回的是什么?

__new__是类级别的方法(第一个参数是cls而非self),它的核心任务是创建并返回类的实例对象:

  • 正常场景下,它会调用父类的__new__(比如super().__new__(cls))来生成当前类的实例,再把这个实例返回。
  • 你也可以让它返回其他对象:子类实例、无关类的实例,甚至None。但只要返回的不是当前类的实例,后续的__init__就不会被触发执行。

举个直观的例子:

class MyClass:
    def __new__(cls):
        print("执行__new__")
        # 调用父类方法创建当前类实例
        instance = super().__new__(cls)
        print(f"__new__返回的实例:{instance}")
        return instance

    def __init__(self):
        print(f"执行__init__,接收的self:{self}")

obj = MyClass()
print(f"最终拿到的obj:{obj}")

运行后你会看到:__new__返回的实例、__init__接收的self、最终的obj是同一个对象。

再试一个返回其他对象的场景:

class AnotherClass:
    pass

class MyClass:
    def __new__(cls):
        print("执行__new__")
        # 返回另一个类的实例
        return AnotherClass()

    def __init__(self):
        # 这个方法不会被执行
        print("执行__init__")

obj = MyClass()
print(type(obj))  # 输出 <class '__main__.AnotherClass'>

这里__init__完全没运行,因为__new__没返回MyClass的实例。

__new__的返回值去哪了?

  1. 若返回的是当前类的实例,这个实例会被作为第一个参数self传给__init__,供初始化逻辑使用。
  2. 最终,这个返回值会作为MyClass()调用的结果,返回给你——也就是你赋值给变量(比如obj)的那个对象。

简单说:__new__造出来的实例,就是你最终拿到的对象,中间会先递给__init__做初始化加工。

什么时候需要用__new__?

普通业务代码基本用不到,但特殊场景会依赖它:

  • 实现单例模式(确保一个类只有一个实例)
  • 修改不可变类的创建逻辑(比如继承int、str这类不可变类型时,需要用__new__调整实例)
  • 动态切换创建的实例类型

内容的提问来源于stack exchange,提问作者lei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:45:38