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

Python继承int类时自定义__init__未触发,报类型错误如何解决?

问题解析:继承int类时__init__未触发且报错的原因

核心原因:不可变类型的实例创建依赖__new__而非__init__

像int、str这类Python内置不可变类型,实例的创建过程是由__new__方法负责的,__init__只是对已经创建好的实例做初始化操作。当你调用a(2,2)时:

  • 首先会调用父类int的__new__方法,它的签名是__new__(cls, value, base=10)——第二个参数会被当成进制参数base。
  • 你传入的第二个2是整数,而base参数只有当第一个参数是字符串时才能使用,所以直接触发TypeError: int() can't convert non-string with explicit base。
  • 由于父类__new__已经报错,程序根本没机会执行子类的__init__方法,所以你的自定义初始化逻辑完全没触发。

解决方法:重写__new__方法处理参数

要实现自定义子类的逻辑,需要先重写__new__方法,正确调用父类的__new__创建合法的int实例,之后再通过__init__添加自定义属性。示例代码如下:

class a(int):
    def __new__(cls, value1, value2):
        # 这里可以自定义父类int实例的初始值,比如取value1、value2的和或其他逻辑
        instance = super().__new__(cls, value1)
        return instance
    
    def __init__(self, value1, value2):
        # 父类int的__init__基本无操作,可省略super().__init__()
        self.value1 = value1
        self.value2 = value2

obj1 = a(2,2)
print(obj1)          # 输出:2(父类int实例的默认行为)
print(obj1.value1)   # 输出:2
print(obj1.value2)   # 输出:2

注意点

不可变类型的子类实例虽然可以添加自定义属性,但因为底层是不可变的,如果你需要修改实例的“值”,还是要遵循不可变类型的规则——本质是创建新的实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:36:27