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

Python中__init__方法有时不被调用的原因?示例代码运行疑问

问题原因分析

官方文档的描述存在隐含前提:__new__()必须返回当前类的实例对象,才会触发后续自动调用__init__()的逻辑。你重写的两个__new__方法都没有满足该前提,才出现和预期不符的输出。

执行流程逐段拆解

1. e = Eggs() 执行逻辑

  • 首先调用Eggs类重写的__new__()方法,第一行打印3 ,对应输出的第一个内容。
  • 你编写的Eggs.__new__()没有写return语句,默认返回None,不属于Eggs类的实例,因此解释器不会自动触发Eggs.__init__()方法,4不会被打印。

2. s = Spam() 执行逻辑

  • 首先调用Spam类重写的__new__()方法,注意Python中__new__的第一个参数是类对象,常规约定命名为cls,你这里错误命名为self容易产生混淆。
  • 你在Spam.__new__()中手动调用了self.__init__(self),强制触发了初始化方法,所以打印出2 。
  • 接下来执行打印语句输出1。
  • 同样Spam.__new__()也没有返回Spam类的实例,因此不会自动触发第二次__init__()调用。

修复示例

如果要符合官方文档的默认执行流程,__new__方法需要调用父类的__new__创建实例并返回,修改后的Eggs类参考如下:

class Eggs(Spam):
    def __new__(cls):
        print("3", end = " ")
        # 调用父类方法创建实例并返回,才会触发自动调用__init__
        return super().__new__(cls)
    def __init__(self):
        print("4", end = " ")

修改后实例化Eggs时会按3 → 2 → 1 → 4的顺序打印,完全符合官方描述的执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:18:00