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

