Python自定义Stack类继承后调用__getitem__切片报KeyError问题
故障原因
- 切片操作触发
__getitem__方法后,执行的self.__class__(self.items[slc])逻辑中,self.__class__对应的是子类SpecificStack而非父类Stack,因此会调用SpecificStack的构造方法初始化切片后的新对象。 - 切片得到的
self.items[slc]是已经完成结构化处理的字典列表,每个元素都是{'time': xx, 'place': xx, 'order': xx}格式的字典,但SpecificStack的__init__要求传入的是原始嵌套数值列表(每个子元素为长度为3的数值列表),构造逻辑里会通过d[0]、d[1]、d[2]读取子元素的对应数值。 - 当构造方法接收到字典列表后,循环取
d[0]时,字典不存在整数类型的键,因此直接抛出KeyError。
可选修复方案
如果需要保留切片返回子类实例的逻辑,可以修改SpecificStack的构造方法,兼容已处理好的字典列表输入:
class SpecificStack(Stack): def __init__(self, some_data): super().__init__() # 兼容已经结构化的字典列表输入 if some_data and isinstance(some_data[0], dict): self.items = some_data return for d in some_data: item = {'time': d[0], 'place': d[1], 'order': d[2]} self.append( item )
如果不需要切片返回子类实例,也可以直接修改父类__getitem__的切片返回逻辑,固定返回Stack实例:
# 父类Stack的__getitem__修改 def __getitem__(self, slc): if isinstance(slc, int): return self.items[slc] else: # 固定返回Stack实例,不随子类变化 return Stack(self.items[slc])
内容的提问来源于stack exchange,提问作者Ignas Nevinskas
相关产品推荐
相关产品推荐

