基于Python OOP实现ToDoList 适配指定测试用例的开发问题
代码核心问题定位
- 类属性误用:
Task类里定义的tasks = {}是所有实例共享的类级数据,不是单个任务的专属存储,不仅会出现不同任务状态互相污染,还会导致状态被反复覆盖。 - 裸变量引用报错:
Task.finish()方法里直接用了不存在的task变量,没有绑定到当前实例的任务对象,运行到这一步本来就会触发NameError。 - 任务存储逻辑错误:
ToDoList里的self.d是单值变量,每次调用add_task都会把新任务覆盖到旧值,最终只会留存最后一个加入的任务,完全没有累加存储的逻辑。 - 打印逻辑错位:初始化
ToDoList的时候就提前打印列表名和分隔符、创建Task实例的时候就自动打印任务文本,和预期的输出顺序完全不符,还会导致输出冗余。 - 遍历逻辑失效:把Task对象当成字典遍历,本身结构就不支持键值取值判断,根本走不通原来的判断分支。
修正后适配测试要求的可运行代码
class Task: def __init__(self, task_content): # 每个实例独立持有任务内容和完成状态 self.content = task_content self.is_finished = False def finish(self): # 修改当前实例的完成状态 self.is_finished = True class ToDoList: def __init__(self, list_name): self.name = list_name # 用列表按加入顺序存储所有Task实例 self.task_list = [] def add_task(self, task): # 追加任务到存储列表,不覆盖已有内容 self.task_list.append(task) def print_list(self): # 按预期顺序统一输出列表内容 print(self.name) print("###") for task in self.task_list: mark = "[x]" if task.is_finished else "[ ]" print(f"{mark} {task.content}") # 给定测试代码直接运行即可得到预期输出 mylist = ToDoList('My sample ToDoList') for i in range(1, 11): task = Task(f'Simple task #{i}') if i % 2: task.finish() mylist.add_task(task) mylist.print_list()
实现优化思路
- 单一职责划分:Task类只负责管理单个任务的内容和状态,不做打印、列表汇总的操作;所有展示、存储相关的逻辑全部由ToDoList类承接,后续修改打印格式、增加任务筛选功能时不需要散落改多处代码。
- 状态标记选型:用布尔值
True/False标记完成状态,比字符串标记更高效,也能避免字符串拼写错误导致的判断失效问题。 - 规避类属性陷阱:所有属于单个对象的专属数据,必须在
__init__中通过self定义为实例属性,不要直接写在类层级上做共享类属性,否则会出现修改一个实例就同步影响所有其他实例的诡异bug。 - 存储结构匹配业务:待办列表天然是按加入顺序展示的线性结构,用列表做存储容器比字典更适配场景,不需要额外维护键值映射关系。
内容的提问来源于stack exchange,提问作者neek98
相关产品推荐
相关产品推荐

