[python|项目]基于面向对象的学生管理系统(小白必写)
前言
(1) 使用面向对象、字符串、列表、字典、文件等知识点来完成一个学生管理系统 V2.0;
(2) 针对学生,该系统具有添加、修改、删除、查询所有学生、查询某个学生、保存信息、退出系统等操作;

一.student.py
记录Student类,属性为名字,性别,年龄,手机号,描述信息
初始化方法:创建学生对象时,给学生赋值属性
:param name: 姓名
:param gender: 性别
:param age: 年龄
:param phone: 手机号
:param desc: 个人描述
class Student:
def __init__(self, name, gender, age, phone, desc):
self.name = name
self.gender = gender
self.age = age
self.phone = phone
self.desc = desc
def __str__(self):
'''
:return: 格式化的学生信息
'''
return f"学生姓名:{self.name},性别:{self.gender},年龄:{self.age},手机号:{self.phone},描述信息:{self.desc}"
测试:
# 测试
if __name__ == '__main__':
# 创建学生对象
s = Student('张三', '男', 18, '12436516', '好学生')
# 打印学生对象(自动调用__str__方法)
print(s)
测试结果:

二.StudentCMS.py
StudentCMS:学生管理系统核心类,封装所有业务逻辑:
初始化:默认学生数据 + 加载文件数据
界面:打印操作菜单
业务:增 / 删 / 改 / 查学生
持久化:文件保存 / 加载学生数据
主程序:循环交互、调度功能
2.1 包的导入
time.sleep():让菜单切换有短暂停顿,不卡顿
Student:封装了学生的姓名、性别、年龄、电话、描述5 个属性
import time
from student import Student
2.2 初始化信息
初始化学生的信息。
作用:系统启动 → 预置 3 个默认学生 → 加载本地保存的数据
def __init__(self):
self.stu_list = [
Student('张三', '男', 23, 354635, '好学生'),
Student('王二', '男', 26, 355346675, '好学生'),
Student('李四', '男', 28, 3165255621, '好学生')
]
self.load_student()
2.3 菜单栏
给用户展示操作菜单
from student import Student
class Studentcms(object):
def __init__(self):
self.stu_list = []
def show_view(self):
print('*'*25)
print('学生管理系统')
print('\t1.添加学生信息')
print('\t2.删除学生信息')
print('\t3.修改学生信息')
print('\t4.查询单个学生信息')
print('\t5.查询所以学生信息')
print('\t6保持学生信息')
print('\t0.退出系统')
print('*'*25)
测试:
#测试
if __name__ == '__main__':
cms = Studentcms()
cms.show_view()
测试结果:

2.4 业务逻辑
学生管理系统的核心启动方法(
start),属于面向对象的类实例方法,是整个系统的交互入口。
核心作用是:持续显示操作菜单 → 接收用户输入 → 根据输入调用对应功能 → 直到用户主动退出。
def start(self):
while True:
time.sleep(0.5)
self.show_view()
input_num = input('请输入您要操作的编号:')
if input_num == '1':
self.add_student()
elif input_num == '2':
self.del_student()
elif input_num == '3':
self.update_student()
elif input_num == '4':
self.search_one_student()
elif input_num == '5':
self.search_all_student()
elif input_num == '6':
self.save_student()
print('保存学生信息成功!\n')
elif input_num == '0':
result = input('您确定要退出吗?(Y/N):')
if result.lower() == 'y':
self.save_student()
print('谢谢您的使用,欢迎下次登入!')
break
else:
print('已取消退出!\n')
else:
print('录入有误,请重新输入!\n')
菜单选择逻辑:
| 输入编号 | 对应功能 | 特殊说明 |
| 1 | 添加学生 | 调用 add_student() |
| 2 | 删除学生 | 调用 del_student() |
| 3 | 修改学生信息 | 调用 update_student() |
| 4 | 查询单个学生 | 调用 search_one_student() |
| 5 | 查询所有学生 | 调用 search_all_student() |
| 6 | 手动保存学生信息 | 保存后打印成功提示 |
| 0 | 退出系统 | 二次确认 + 退出前自动保存 |
| 其他 | 输入错误 | 提示重新输入 |
2.5 增删改查
增:输入信息 → 新建学生 → 放进列表
删:输入姓名 → 遍历找到 → 从列表删除
改:输入姓名 → 遍历找到 → 重新赋值
查:输入姓名 / 直接打印 → 显示学生信息
def add_student(self):
name = input('请输入学生姓名:')
gender = input('请输入学生性别:')
age = int(input('请输入学生年龄:'))
phone = input('请输入学生电话:')
desc = input('请输入学生描述信息:')
stu = Student(name, gender, age, phone, desc)
self.stu_list.append(stu)
print(f'添加{name}学生信息成功!\n')
def del_student(self):
del_name = input('请输入要删除的学生姓名:')
for stu in self.stu_list:
if stu.name == del_name:
self.stu_list.remove(stu)
print(f'学生{del_name}删除成功!\n')
break
else:
print('查无此人,请重新操作\n')
def update_student(self):
upd_name = input('请输入要修改的学生姓名:')
for stu in self.stu_list:
if stu.name == upd_name:
stu.gender = input('请输入修改后的性别:')
stu.age = int(input('请输入修改后的年龄:')) # 修复缺少的冒号
stu.phone = input('请输入修改后的电话:')
stu.desc = input('请输入修改后的描述信息:')
print(f'学生{upd_name}信息修改成功!\n')
break
else:
print('查无此人,请重新操作\n')
def search_one_student(self):
search_name = input('请输入要查找的学生姓名:')
for stu in self.stu_list:
if stu.name == search_name:
print(stu, end='\n\n') # 修复致命bug:删除了错误的remove()
break
else:
print('查无此人,请重新操作\n')
def search_all_student(self):
if len(self.stu_list) == 0:
print('暂无学生信息,请添加后查询!\n')
else:
for stu in self.stu_list:
print(stu)
print()
2.6 保持信息
关闭程序,数据不会丢失!
原理:Python 对象不能直接存文件 → 转换成字典 → 写入 txt 文件
def save_student(self):
# 保存:对象转字典,写入文件
with open('./stu_data.txt', 'w', encoding='utf-8') as dest_f:
stu_dict = [stu.__dict__ for stu in self.stu_list]
dest_f.write(str(stu_dict))
2.7 加载信息
原理:读取文件字符串 → 还原为字典 → 字典转回学生对象
此外这里还增加了异常处理
异常处理:文件不存在也不会崩溃
def load_student(self):
# 加载:修复模式为 r(只读),w会清空文件
try:
with open('./stu_data.txt', 'r', encoding='utf-8') as src_f:
stu_data = src_f.read()
if stu_data: # 判断文件有内容再执行
stu_list = eval(stu_data)
self.stu_list = [Student(**stu_dict) for stu_dict in stu_list]
except:
# 文件不存在则创建空文件
with open('./stu_data.txt', 'w', encoding='utf-8') as src_f:
pass
三.main.py
这是项目启动的唯一入口,是运行整个系统的钥匙
if __name__ == '__main__' 是 Python 程序的标准入口
代码逻辑:导入类 → 创建对象 → 初始化数据 → 启动系
from StudentCMS import Studentcms
if __name__ == '__main__':
cms = Studentcms()
cms.start()
四.扩展
文件无法直接存储 Python 对象,只能存储字符串、数字、字典等基础数据。
__dict__可以把对象转化为字典
从 学生->字典,[学生,学生,学生]->[字典,字典,字典],字典->对象三个角度
from student import Student
# 学生->字典
s1 = Student('张三','男',23,354635,'好学生')
my_dict = s1.__dict__
print(my_dict)
print(type(my_dict))
print('-'*25)
#[学生,学生,学生]->[字典,字典,字典]
s1 = Student('张三','男',23,354635,'好学生')
s2 = Student('王二', '男', 26, 355346675, '好学生')
s3 = Student('李四', '男', 28, 3165255621, '好学生')
stu_list = [s1,s2,s3]
list_dict = [stu.__dict__ for stu in stu_list]
print(stu_list)
print('-'*25)
#字典->对象
my_dict = {'name':'张三','gender':'男','age':23,'phone':354635,'desc':'好学生'}
s5 = Student(my_dict['name'],my_dict['gender'],my_dict['age'],my_dict['phone'],my_dict['desc'])
print(s5)
print(type(s5))
print('-'*25)
s6 = Student(**my_dict)
print(s6)
print(type(s6))
**字典字典转对象的最优解,自动解包关键字参数,代码极简。
结果:

更多推荐


所有评论(0)