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

