📖 知识点回顾
类、实例对象、
__init__构造方法实例方法、
self封装,通过方法操作保护属性
__str__魔术方法异常捕获、文件读写、os 判断文件存在
业务规则
Student 类:封装学员信息,修改分数带校验
StudentManager 管理类:负责加载文件、保存文件、新增学员、查看学员
菜单:1 新增学员|2 查看全部学员|0 退出
数据持久化:使用 student.txt 保存学员档案,逗号分隔
输入校验,捕获异常,防止程序崩溃
⚔️ Kata 实战任务
任务需求:
编写
Student学员类,包含 name,age,_score;set_score 修改分数;__str__美化输出编写
StudentManager管理类,内部保存学员列表,提供:load:从 student.txt 加载历史学员
save:保存学员列表到文件
add_student:新增学员,带输入校验
show_all:展示全部学员
主循环菜单,调用管理类完成整套系统
参考代码
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
✅ 学员新增成功,已保存至文件!
🧠 思考题
对比之前函数版本学员系统,面向对象版本的优势是什么?
拓展需求:增加删除学员功能,你会在哪个类里面新增方法?
行者孙Python