派生类__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
相关产品推荐
相关产品推荐

