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

派生类__init__未被调用?Python array子类构造异常排查

问题原因及解决方法

为什么__init__没被调用?

Python创建类实例时,会先执行__new__方法生成实例对象,只有当__new__成功创建出实例后,才会调用__init__进行初始化。

array是Python内置的序列类型,它的__new__方法要求第一个参数必须是类型码(比如'h'代表短整型)。你直接调用b([1,2,3,4])时,这个列表参数会被直接传给父类array的__new__方法,它不接受列表作为第一个参数,所以立刻抛出TypeError,程序终止,子类的__init__根本没机会执行——这就是你替换super().__init__为raise ValueError也没触发的原因。

解决方法

要实现“传列表就能实例化”的需求,你需要重写子类的__new__方法,先把参数处理成父类__new__需要的格式,再调用父类的__new__创建实例,之后__init__就能正常执行了。

示例代码:

from array import array

class b(array):
    def __new__(cls, val: list[int]):
        # 调用父类__new__,传入类型码和列表
        return super().__new__(cls, 'h', val)
    
    def __init__(self, val: list[int]):
        # 此时实例已创建,__init__可正常执行
        super().__init__('h', val)

# 正常实例化
obj = b([1,2,3,4])
print(obj)  # 输出:array('h', [1, 2, 3, 4])

如果不需要在__init__里做额外初始化,也可以只重写__new__:

from array import array

class b(array):
    def __new__(cls, val: list[int]):
        return super().__new__(cls, 'h', val)

obj = b([1,2,3,4])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:55:43