Python中如何删除带有多个构造参数的自定义类实例对象
问题根因
你的删除逻辑存在两个核心错误:
list.remove()方法要求传入的是列表中已存在的实例对象,你调用item(remove)是临时新建了一个完全独立的新对象,哪怕属性完全相同,两个对象的内存地址也不一样,默认规则下无法匹配到列表里的原有元素- 你引导用户输入的是元素的下标索引,直接按索引删除即可,不需要构建新对象匹配;另外
input()返回的是字符串类型,需要先转为整数才能作为下标使用 - 额外提示:不要用
list作为变量名,这是Python的内置类型关键字,后续容易触发未知报错
修复方案
1. 最简修复(直接按下标删除)
仅修改remove_Item函数即可正常运行:
def remove_Item(): print("索引从0开始递增,第一个物品对应索引0") remove_idx = input("请输入要删除的物品对应的索引: \n") print(f'你输入的索引是 {remove_idx}') # 转整数后用pop方法按下标删除,也可以替换为 del list[int(remove_idx)] list.pop(int(remove_idx))
2. 优化版(可选,提升使用体验)
可以给item类加__repr__方法,打印列表时更易读,同时替换掉保留字变量名:
# 修复类定义,类名推荐用大驼峰格式 class Item: def __init__(self, name, quantity, inv_date): self.name = name self.quantity = quantity self.inv_date = inv_date # 自定义打印格式 def __repr__(self): return f"Item(name='{self.name}', quantity={self.quantity}, inv_date={self.inv_date})" # 变量名不要用list,改为语义更清晰的inventory inventory = [] # 后续添加元素、遍历、增删操作都改用inventory操作即可
如果你确实需要按物品名称删除而不是按索引删除,也可以直接遍历列表匹配属性实现:
def remove_Item_by_name(): remove_name = input("请输入要删除的物品名称: \n") # 遍历找到对应元素删除 for item in inventory: if item.name == remove_name: inventory.remove(item) print(f"已删除物品{remove_name}") break else: print("未找到对应名称的物品")
内容的提问来源于stack exchange,提问作者Jordan Smalley
相关产品推荐
相关产品推荐

