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

继承array.array的类重写__init__后仍触发TypeError是什么原因?

问题原因

你遇到的报错核心原因是Python实例化类时会先执行__new__方法创建实例,再执行__init__方法初始化实例。array.array是C实现的内置类型,它的__new__方法要求第一个入参必须是表示元素类型的字符码,你继承时没有重写__new__,所以你传入的a参数会先被父类的__new__接收校验,直接触发报错,这时候还没走到你写的__init__逻辑里。

解决方法
  • 如果你只是想基于array做封装,不需要完全复用array.array的所有原生方法,更推荐用组合而非继承的方式实现,避免适配父类的底层规则:
import array
import numpy as np

class DiffRleArray:
    def __init__(self, arr: array.array):
        self._raw_arr = arr
        self._internal = np.ediff1d(arr)

# 正常实例化无报错
a = array.array('d', [1.0, 2.0, 3.14])
obj = DiffRleArray(a)
  • 如果你确实需要继承array.array保留原生array的所有行为,那你需要重写__new__方法适配父类的入参要求:
import array
import numpy as np

class diff_rle_array(array.array):
    def __new__(cls, arr: array.array):
        # 调用父类__new__传入符合要求的参数创建实例
        instance = super().__new__(cls, arr.typecode, arr)
        return instance
    
    def __init__(self, arr: array.array):
        self._internal = np.ediff1d(arr)

a = array.array('d', [1.0, 2.0, 3.14])
obj = diff_rle_array(a)
# 既可以像原生array一样操作,也有自定义属性
print(obj[0]) 
print(obj._internal)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 18:18:01