You need to enable JavaScript to run this app. 基于Python OOP实现ToDoList 适配指定测试用例的开发问题
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 20:24:01