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__的返回值去哪了?
- 若返回的是当前类的实例,这个实例会被作为第一个参数
self传给__init__,供初始化逻辑使用。 - 最终,这个返回值会作为
MyClass()调用的结果,返回给你——也就是你赋值给变量(比如obj)的那个对象。
简单说:__new__造出来的实例,就是你最终拿到的对象,中间会先递给__init__做初始化加工。
什么时候需要用__new__?
普通业务代码基本用不到,但特殊场景会依赖它:
- 实现单例模式(确保一个类只有一个实例)
- 修改不可变类的创建逻辑(比如继承
int、str这类不可变类型时,需要用__new__调整实例) - 动态切换创建的实例类型
内容的提问来源于stack exchange,提问作者lei
相关产品推荐
相关产品推荐

