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
相关产品推荐
相关产品推荐

