行者孙Python

铸器篇-Day78 综合 Kata:学员管理系统(面向对象版本)

📖 知识点回顾

  1. 类、实例对象、__init__构造方法

  2. 实例方法、self

  3. 封装,通过方法操作保护属性

  4. __str__魔术方法

  5. 异常捕获、文件读写、os 判断文件存在

业务规则

  1. Student 类:封装学员信息,修改分数带校验

  2. StudentManager 管理类:负责加载文件、保存文件、新增学员、查看学员

  3. 菜单:1 新增学员|2 查看全部学员|0 退出

  4. 数据持久化:使用 student.txt 保存学员档案,逗号分隔

  5. 输入校验,捕获异常,防止程序崩溃

⚔️ Kata 实战任务

任务需求:

  1. 编写Student学员类,包含 name,age,_score;set_score 修改分数;__str__美化输出

  2. 编写StudentManager管理类,内部保存学员列表,提供:

    • load:从 student.txt 加载历史学员

    • save:保存学员列表到文件

    • add_student:新增学员,带输入校验

    • show_all:展示全部学员

  3. 主循环菜单,调用管理类完成整套系统

参考代码

import os

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self._score = score

    def set_score(self, new_score):
        if 0 <= new_score <= 100:
            self._score = new_score
            return True, "分数修改成功"
        else:
            return False, "分数必须在0~100之间"

    def get_score(self):
        return self._score

    def __str__(self):
        return f"姓名:{self.name} | 年龄:{self.age} | 分数:{self._score}"


class StudentManager:
    FILE_NAME = "student.txt"
    def __init__(self):
        self.student_list = []
        self.load()

    def load(self):
        """加载文件中的学员数据"""
        if os.path.isfile(self.FILE_NAME):
            with open(self.FILE_NAME, "r", encoding="utf-8") as f:
                lines = f.readlines()
                for line in lines:
                    line = line.strip()
                    if not line:
                        continue
                    name, age_str, score_str = line.split(",")
                    stu = Student(name, int(age_str), int(score_str))
                    self.student_list.append(stu)

    def save(self):
        """保存全部学员到文件"""
        with open(self.FILE_NAME, "w", encoding="utf-8") as f:
            for stu in self.student_list:
                line = f"{stu.name},{stu.age},{stu.get_score()}\n"
                f.write(line)

    def add_student(self):
        """新增学员"""
        name = input("请输入学员姓名:").strip()
        age_str = input("请输入学员年龄:").strip()
        score_str = input("请输入学员分数:").strip()
        try:
            age = int(age_str)
            score = int(score_str)
            if len(name) == 0:
                raise ValueError("姓名不能为空")
            if not (6 <= age <= 30):
                raise ValueError("年龄范围必须是6~30")
            if not (0 <= score <= 100):
                raise ValueError("分数范围必须是0~100")
        except ValueError as e:
            print(f"❌ 添加失败:{e}\n")
            return
        new_stu = Student(name, age, score)
        self.student_list.append(new_stu)
        self.save()
        print("✅ 学员新增成功,已保存至文件!\n")

    def show_all(self):
        """查看全部学员"""
        if len(self.student_list) == 0:
            print("📭 暂无学员档案\n")
            return
        print("===== 全部学员档案 =====")
        for idx, stu in enumerate(self.student_list):
            print(f"{idx+1}. {stu}")
        print("========================\n")


def main():
    manager = StudentManager()
    print("==== OOP面向对象学员管理系统 ====")
    while True:
        print("菜单:")
        print("1.新增学员")
        print("2.查看全部学员")
        print("0.退出系统")
        choice = input("请选择功能编号:").strip()
        if choice == "1":
            manager.add_student()
        elif choice == "2":
            manager.show_all()
        elif choice == "0":
            print("👋 系统退出,档案已保存")
            break
        else:
            print("⚠️ 选项无效,请重新选择\n")


if __name__ == "__main__":
    main()

 

运行示例

 

==== OOP面向对象学员管理系统 ====
菜单:
1.新增学员
2.查看全部学员
0.退出系统
请选择功能编号:2
===== 全部学员档案 =====
1. 姓名:小明 | 年龄:16 | 分数:88
2. 姓名:小红 | 年龄:15 | 分数:92
3. 姓名:小刚 | 年龄:16 | 分数:75
========================

菜单:
1.新增学员
2.查看全部学员
0.退出系统
请选择功能编号:1
请输入学员姓名:小雅
请输入学员年龄:15
请输入学员分数:95
✅ 学员新增成功,已保存至文件!

 

🧠 思考题

  1. 对比之前函数版本学员系统,面向对象版本的优势是什么?

  2. 拓展需求:增加删除学员功能,你会在哪个类里面新增方法?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我