Python cChallenge类实例列表用列表推导式访问Id报AttributeError问题
问题原因
该报错的核心原因是 cList 列表中不全是 cChallenge 类的实例,混杂了 cChallenge 类本身的引用:
Id是定义在__init__中的实例属性,只有实例化后的cChallenge对象才拥有该属性- 当列表推导式遍历到
cChallenge类对象时,就会触发AttributeError: type object 'cChallenge' has no attribute 'Id'异常 - 单独访问
cList[1].Id正常,是因为索引为1的元素是合法实例,其他位置的元素存在类对象
解决方法
- 优先排查
cList的填充逻辑,找到误将类本身加入列表的代码。最常见的错误是实例化时漏写构造方法括号:
错误写法:
正确写法:cList.append(cChallenge)# 传入对应参数生成实例后再加入列表 cList.append(cChallenge(Id=380, Title="示例题目")) - 若需要临时兼容异常情况,可在列表推导式中增加属性存在性判断,过滤异常元素:
print([x.Id for x in cList if hasattr(x, 'Id')]) - 若要定位具体混入类对象的位置,可执行调试代码逐一枚举元素类型:
类对象的输出为for idx, item in enumerate(cList): print(f"索引{idx} 元素类型:{type(item)}")<class '__main__.cChallenge'>,实例的输出为<__main__.cChallenge object at 内存地址>,可快速定位错误位置。
内容的提问来源于stack exchange,提问作者Lorenzo Monaco
相关产品推荐
相关产品推荐

