大家好!欢迎来到我的博客,今天我们将继续探讨如何用Python实现一个简单的学生管理系统。我们将继续改进之前的学生管理系统,将其重构为使用类的方式,使代码更加面向对象,便于管理和扩展。通过使用类,我们可以将相关的功能和数据封装在一起,提升代码的可读性和可维护性。
一、改进后的项目结构
我们将使用面向对象的方法重构代码。新的项目结构如下:
student_management_system/
│
├── main.py
└── datas.json
二、代码实现
以下是重构后的学生管理系统代码:
import json
import os
FILE_JSON = "./datas.json"
class Student:
"""学生类,表示学生的基本信息"""
def __init__(self, sid, name, age, sex):
self.id = sid
self.name = name
self.age = age
self.sex = sex
def to_dict(self):
"""将学生信息转换为字典形式"""
return {
"id": self.id,
"name": self.name,
"age": self.age,
"sex": self.sex
}
class StudentManagementSystem:
"""学生管理系统类,负责管理学生信息"""
def __init__(self):
self.datas = []
self.load_datas()
def save_datas(self):
"""将学生数据保存到JSON文件中"""
with open(FILE_JSON, "w") as f:
json.dump([student.to_dict() for student in self.datas], f)
def load_datas(self):
"""从JSON文件加载学生数据"""
if os.path.exists(FILE_JSON):
with open(FILE_JSON, mode="r") as f:
student_data = json.load(f)
self.datas = [Student(student["id"], student["name"], student["age"], student["sex"]) for
student in
student_data]
def show_menu(self):
"""显示主菜单"""
menu = """输入数字0,退出系统
输入数字1,添加学生信息
输入数字2,查看所有学生信息
输入数字3,统计学生平均年龄
输入数字4,统计学生性别比例"""
print(menu)
def option_is_true(self):
"""验证用户输入的菜单选项"""
option = input("请输入选择:")
if option not in [f"{i}" for i in range(5)]:
print("请输入正确选项!")
return None
else:
return option
def student_name(self):
"""输入学生姓名,并验证合法性"""
while True:
name = input("请输入学生姓名:")
if 2 <= len(name) <= 4:
return name
else:
print("输入不合法,姓名长度应在2-4之间")
def student_age(self):
"""输入学生年龄,并验证合法性"""
while True:
age = input("请输入学生年龄:")
if age not in [str(i) for i in range(15, 26)]:
print("输入不合法,年龄应该在15-25之间")
else:
return int(age)
def student_sex(self):
"""输入学生性别,并验证合法性"""
while True:
sex = input("请输入学生性别:")
if sex not in ["男", "女"]:
print("输入不合法,请输入男或女")
else:
return sex
def yes_no(self):
"""询问用户是否继续操作"""
while True:
sub_option = input("是否继续:是(Y)/否(N)")
if sub_option in ["Y", "y", "N", "n"]:
return sub_option
else:
print("输入不合法,请输入正确选项Y/N")
def add_student(self):
"""添加学生信息"""
while True:
sid = 101 if not self.datas else self.datas[-1].id + 1
name = self.student_name()
age = self.student_age()
sex = self.student_sex()
student = Student(sid, name, age, sex)
self.datas.append(student)
self.save_datas()
print(f"现在共有学生{len(self.datas)}人")
sub_option = self.yes_no()
if sub_option in ["N", "n"]:
break
def show_all_students(self):
"""查看所有学生信息"""
if self.datas:
for student in self.datas:
print(f"id:{student.id}\tname:{student.name}\t age:{student.age}\t sex:{student.sex}")
else:
print("没有找到学生数据,请先添加学生信息")
def get_avg_age(self):
"""统计学生平均年龄"""
if self.datas:
total = sum(student.age for student in self.datas)
avg_age = total / len(self.datas)
print(f"学生平均年龄为:{avg_age:.2f}")
else:
print("没有找到学生信息,计算平均年龄需要先添加学生信息!")
def get_sex_scale(self):
"""统计学生性别比例"""
if self.datas:
man_count = sum(1 for student in self.datas if student.sex == "男")
woman_count = sum(1 for student in self.datas if student.sex == "女")
total_count = len(self.datas)
man_ratio = man_count / total_count * 100
woman_ratio = woman_count / total_count * 100
print(f"男生占比:{man_ratio:.2f}%\t女生占比:{woman_ratio:.2f}%")
else:
print("没有找到学生信息,统计学生性别比例需要先添加学生信息!")
def main(self):
"""主程序入口"""
while True:
self.show_menu() # 显示菜单
option = self.option_is_true() # 获取用户选择
if option == "0":
print("感谢使用学生管理系统!")
break # 退出系统
elif option == "1":
self.add_student() # 添加学生信息
elif option == "2":
self.show_all_students() # 查看所有学生信息
elif option == "3":
self.get_avg_age() # 统计学生平均年龄
elif option == "4":
self.get_sex_scale() # 统计学生性别比例
if __name__ == "__main__":
sms = StudentManagementSystem() # 创建学生管理系统实例
sms.main() # 运行主程序
三、代码解读
在重构后的代码中,我们使用了两个类:
1. Student类:表示学生的信息,包括学生的ID、姓名、年龄和性别。通过 ' to_dict ' 方法可以将学生对象转换为字典格式,以方便保存到JSON文件中。
2. StudentManagementSystem类:封装了学生管理系统的所有功能,包括数据的加载和保存、用户输入的处理、学生信息的添加和查询、统计功能等。
功能模块解读:
1. 数据加载与保存:
' load_datas() ' :从JSON文件读取学生数据并创建`Student`对象。
' save_datas() ' :将学生数据保存到JSON文件中。
2. 用户界面与输入处理:
' show_menu() ' :显示操作菜单。
' option_is_true() ' :验证用户输入的选项。
' student_name() ' , ' student_age() ' , ' student_sex() ' :分别处理用户的姓名、年龄和性别输入,并进行合法性验证。
3. 学生信息管理:
' add_student() ' :添加学生信息并保存。
' show_all_students() ' :输出所有学生信息。
4. 统计功能:
' get_avg_age() ' :计算并打印学生的平均年龄。
' get_sex_scale() ' :计算并打印男女学生的比例。
5. 主程序:
' main() ' :程序的入口,循环显示菜单并处理用户的选择。
四、如何运行程序
1. 确保你的计算机上已经安装了Python,推荐使用3.x版本。
2. 创建一个新的Python文件,如 `main.py`,并将上述代码复制粘贴到该文件中。
3. 在同一目录下创建一个空的 `datas.json` 文件(如果文件不存在,程序会自动创建,可以不自己手动创建)。
4. 在命令行中运行程序,或者在PyCharm等编辑软件里直接运行:
python main.py
5. 按照屏幕上的提示输入选项,进行相应的操作。
五、总结
通过使用类的方式重构学生管理系统,我们的代码变得更加模块化和易于维护。面向对象的设计使得每个功能都封装在相应的类中,提升了代码的可读性和可扩展性。
未来,你可以继续拓展此系统的功能,例如添加学生成绩管理、课程选择、搜索和删除学生信息等功能,进一步提升系统的实用性。
希望这篇博文对你有所帮助。