Python报错'CartItem' object is not subscriptable及异常输出问题求解
报错原因与修复方案
1. 'CartItem' object is not subscriptable 报错根因
问题出在Cart类的__str__方法的遍历逻辑:
self.items里存储的元素本身就是CartItem实例,使用for item in self.items遍历的时候,每次取出的item已经是单个购物车项对象- 原代码额外加了
item[index]的下标访问操作,但CartItem类没有实现__getitem__方法,不支持下标取值,因此触发报错
错误代码片段
for item in self.items: print(str(index) + ": " + item[index].name + ' --> ' + item[index].price) index += 1
修正逻辑
直接访问item的属性即可,不需要再加下标,也可以用enumerate简化索引遍历逻辑:
for index, item in enumerate(self.items): print(f"{index}: {item.name} --> {item.price}")
2. 输出对象内存地址的原因
你在addItem方法里写了print(self.items),打印列表时,Python会调用列表中每个元素的__repr__方法输出内容,而非__str__方法:
- 你只给
CartItem实现了__str__方法,没有实现__repr__方法,因此会输出默认的<__main__.CartItem object at 0x....>内存地址格式 - 当你删除
print(userCart)代码后,控制台输出的内存地址就是addItem里的print(self.items)打印的结果
如果要让打印列表时也输出可读内容,给CartItem类补充__repr__方法即可,比如可以直接自定义可读格式:
def __repr__(self): return f"{self.name} --> {self.price}"
修正后完整可运行代码
class CartItem: def __init__(self, name, price): self.name = name self.price = price def __str__(self): print(self.name + " --> " + self.price) return "-- item printed --\n" # 补充__repr__解决列表打印内存地址问题 def __repr__(self): return f"{self.name} --> {self.price}" class Cart: def __init__(self): self.items = [] def __str__(self): if len(self.items) > 0: # 用enumerate简化索引遍历 for index, item in enumerate(self.items): print(f"{index}: {item.name} --> {item.price}") else: print("No Items in Cart") return "-- cart items printed--\n" def addItem(self, cartItem): self.items.append(cartItem) print (cartItem.name + ", costing $" + cartItem.price + ", has been added to cart\n") print(self.items) flarn = CartItem("flarn", "200.00") print(flarn) userCart = Cart() userCart.addItem(flarn) print(userCart)
内容的提问来源于stack exchange,提问作者WhiteRau
相关产品推荐
相关产品推荐

