6个月Python学习计划 Day 18 - 项目实战 · 学生成绩管理系统(OOP版)
第三周 Day 5
🎯 今日目标
- 运用类与对象封装学生数据与操作
- 实现添加、查询、删除、排序等功能
- 使用魔术方法美化输出
📦 项目需求描述
我们要构建一个简易的学生成绩管理系统,功能包括:
- 添加学生(姓名、学号、成绩)
- 查询所有学生
- 查找指定学号学生
- 删除学生
- 按成绩排序输出
- 退出系统
🧬 设计类结构
class Student:def __init__(self, sid, name, score):self.sid = sidself.name = nameself.score = scoredef __str__(self):return f"{self.sid:<6} {self.name:<10} {self.score:<5}"class StudentManager:def __init__(self):self.students = []def add_student(self, sid, name, score):self.students.append(Student(sid, name, score))def show_all(self):print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in self.students:print(stu)def find_by_sid(self, sid):for stu in self.students:if stu.sid == sid:print("找到学生:", stu)returnprint("未找到该学号的学生。")def delete_by_sid(self, sid):for stu in self.students:if stu.sid == sid:self.students.remove(stu)print("删除成功!")returnprint("删除失败,未找到该学号。")def sort_by_score(self):self.students.sort(key=lambda x: x.score, reverse=True)print("成绩排序成功!")self.show_all()
🧪 主程序入口
def run():manager = StudentManager()while True:print("\n==== 学生成绩管理系统 ====")print("1. 添加学生")print("2. 显示所有学生")print("3. 查找学生")print("4. 删除学生")print("5. 按成绩排序")print("6. 退出")choice = input("请输入操作编号:")if choice == "1":sid = input("请输入学号:")name = input("请输入姓名:")try:score = float(input("请输入成绩:"))manager.add_student(sid, name, score)print("添加成功!")except:print("成绩格式不正确!")elif choice == "2":manager.show_all()elif choice == "3":sid = input("请输入要查找的学号:")manager.find_by_sid(sid)elif choice == "4":sid = input("请输入要删除的学号:")manager.delete_by_sid(sid)elif choice == "5":manager.sort_by_score()elif choice == "6":print("感谢使用,已退出。")breakelse:print("输入无效,请重新输入。")
👉 最后在底部加一句:
if __name__ == "__main__":run()
📝 今日练习任务
-
增加一个功能:根据姓名模糊搜索学生
我们在 StudentManager 类中新增一个方法 search_by_name:
def search_by_name(self, keyword):result = [stu for stu in self.students if keyword.lower() in stu.name.lower()]if result:print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in result:print(stu)else:print("未找到相关学生。")
在主循环中添加对应的选项:
elif choice == "7":keyword = input("请输入要查找的姓名关键词:")manager.search_by_name(keyword)
别忘了在菜单中加入:
print("7. 按姓名模糊查找")
-
为 Student 类增加一个 eq 方法,便于比较对象是否相同(学号相同即为同一人)
我们在 Student 类中添加:def __eq__(self, other):if isinstance(other, Student):return self.sid == other.sidreturn False
这个方法可以让我们用 == 比较两个 Student 对象是否代表同一位学生(通过学号)。
🧾 今日总结
技术点 | 应用说明 |
---|---|
类与对象 | 将学生抽象为对象,提高代码清晰度和扩展性 |
魔术方法 str | 优化输出格式 |
排序函数 + lambda | 实现根据对象属性排序 |
结构设计思维 | 体现类封装、方法划分、模块职责分离等理念 |