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

继承int类时触发TypeError的原因探究

问题原因分析:继承int时的实例化错误

1. 内置不可变类型的__new__方法特殊性

Python 创建对象分为两个核心步骤:__new__ 负责创建实例对象,__init__ 负责初始化实例。对于 int 这类内置不可变类型,它们的实例创建逻辑由 __new__ 主导,且 __new__ 严格要求传入符合 int 构造规则的参数(字符串、字节类对象或实数)。

当你定义 class B(A, int) 时,实例化 B(lambda t:t) 会按照方法解析顺序(MRO)优先调用优先级最高的 __new__ 方法。由于 int 是内置类型,它的 __new__ 会被触发,而你传入的 lambda 函数不符合 int.__new__ 的参数要求,因此直接抛出 TypeError——这也是你觉得 int 的构造函数没执行的原因:报错发生在 __new__ 阶段,还没到 __init__ 的执行环节。

2. 自定义类与空类的差异

当你把 int 换成自定义类(比如空类或示例中的 C 类)时,这些类的 __new__ 默认继承自 object.__new__,而 object.__new__ 只需要接收类对象(cls)作为第一个参数,不会额外校验后续传入的参数,因此能顺利创建实例。

以你第二个例子中的 C 类为例,由于 A 的 __init__ 没有调用 super().__init__(),方法解析顺序中后续的 C.__init__ 不会被执行,所以即使传入的 lambda 不符合 C.__init__ 的参数要求,也不会触发断言错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:15:04