Python之面向对象- 类属性、类方法练习

📅 2026/7/24 6:25:58 👁️ 阅读次数 📝 编程学习
Python之面向对象- 类属性、类方法练习

题目要求:

  1. 创建一个TodoList类,表示家庭任务清单,包含以下内容:

    • 类属性total_tasks(所有待办事项的总数,初始值为0)、total_complete_tasks(所有已完成任务总数)
    • 实例属性owner(拥有者)、task_type(类别,例如“生活”,“工作”),tasks(任务列表,每个任务是一个字典:{“task”: “任务名”, “completed”: False})、created_time(创建时间,提示datetime.datetime.now()可以获取当前时间)
  2. __init__方法中:

    • 初始化实例属性
    • 任务列表为空
  3. 定义实例方法:

    • add_task(self,task_name):添加新任务(更新tasks列表,并更新total_tasks+=1)
    • complete_task(self,task_name):将指定任务标记为已完成(并更新total_complete_tasks+=1)
    • show_tasks(self,show_all=True):显示所有任务(如果show_all=False,只显示未完成的任务)
    • delete_task(self,task_name):删除指定任务(更新tasks列表,并更新total_tasks-=1)
    • get_progress(self):计算并返回单个任务清单中完成任务的百分比
  4. 定义类方法:

    • get_total_tasks(cls):获取家庭所有待办事项的总数
    • get_total_progress(cls):获取家庭所有任务完成百分比
  5. 创建2个待办事项列表(不同拥有者),并进行以下操作:

    • 分别添加几个个任务
    • 完成部分任务
    • 显示所有任务和只显示未完成任务
    • 查看任务完成进度
    • 删除一个任务
importdatetimeclassTodoList:total_tasks=0total_complete_tasks=0""" 写法一: self.tasks 没有通过形参赋值,这样的话,表示当前任务清单的任务必须是在任务清单创建好之后, 才能一个一个通过 add_task 方法添加。 此时无法在创建 ToolList 对象时,直接在外面创建好任务列表直接导入。 比如:新申请一个微信号,然后再一个一个加好友。 """def__init__(self,owner,task_type):self.owner=owner self.task_type=task_type self.tasks=[]self.created_time=datetime.datetime.now()""" 写法二: self.tasks 通过形参赋值,表示当前任务清单的任务可以在创建 ToolList 对象时,预先从外边导入一个已经有部分任务的任务清单, 之后也仍然可以 add_task 方法再添加新任务。 比喻,买了一个新收集,可以从原来的手机上导入通讯录。之后也可以在通讯录中添加新好友的信息。 """# def __init__(self,owner, task_type, tasks):# self.owner = owner# self.tasks = tasks# self.task_type = task_type# self.created_time = datetime.datetime.now()""" 写法三:结合上边的两种 """# def __init__(self,owner, task_type, tasks = None):# self.owner = owner# self.tasks = tasks if tasks else []# self.task_type = task_type# self.created_time = datetime.datetime.now()""" 在实例方法中,访问实例属性,或另一个实例方法,都是通过 self 访问类属性,或另一个类方法, 都是通过 类名. 在类方法中,不能直接访问实例属性,实例方法 访问类属性,或另一个类方法, 都是通过 cls. 在静态方法中,不能直接访问实例属性,实例方法 通常也不会访问类属性或类方法, 但是如果要访问类属性或类方法,只能通过 类名. """defadd_task(self,task_name):task={"task":task_name,"completed":False}self.tasks.append(task)TodoList.total_tasks+=1defcomplete_task(self,task_name):fortaskinself.tasks:iftask["task"]==task_name:task["completed"]=TrueTodoList.total_complete_tasks+=1""" 一个方法是否该 return 值,通常什么规则? (1) 你这个方法是添加、修改、删除,通常不 return,或者要 return 的话,通常返回是否操作成功 (2)你这个方法是查询xx: 一种是直接 print,这个查询的结果限定只能在控制台打印,对于现阶段来说没问题, 因为目前咱们这个查询的数据没有别的去向,只能在控制台打印 一种是 return 查询的内容,这个查询的结果可以在测试代码中加 print 打印, 也可以将来将查询结果存储到数据库中,或发送到页面中显示,更灵活 """defshow_tasks(self,show_all=True):ifshow_all:returnself.taskselse:return[taskfortaskinself.tasksifnottask["completed"]]defdelete_task(self,task_name):fortaskinself.tasks:iftask["task"]==task_name:self.tasks.remove(task)TodoList.total_tasks-=1iftask["completed"]:TodoList.total_complete_tasks-=1defget_progress(self):returnf"{sum(1 for task in self.tasks if task["completed"]) / len(self.tasks) :.2%}"@classmethoddefget_total_tasks(cls):returncls.total_tasks@classmethoddefget_total_progress(cls):returnf"{cls.total_complete_tasks/(cls.total_tasks):.2%}"# 测试print("开始的任务清单:")t1=TodoList("老师","教学")t1.add_task("写教案")t1.add_task("备课")s1=TodoList("学生","学习")s1.add_task("做数学练习册")s1.add_task("背单词")print(t1.show_tasks())print(s1.show_tasks())print("已完成的任务清单:")t1.complete_task("备课")print(t1.show_tasks())print("老师未完成的任务清单:")print(t1.show_tasks(False))print("老师的任务总进度:",t1.get_progress())print("班级的任务总数量:",TodoList.get_total_tasks())print("班级的任务总进度:",TodoList.get_total_progress())