面向对象编程实战
按面向过程函数实现的学生管理需求,将学生管理系统修改为面向对象方式实现
- 在现有功能基础上,需将程序运行中操作的数据保存到 data.txt 文件中
- 程序退出时保存数据到文件
- 程序启动时从文件加载数据到程序
# stu.py
# -*- coding: utf-8 -*-
import json
# 读方法
def read_json():
with open('data.json', 'r', encoding='utf-8') as file:
content = json.load(file)
if content == None:
return []
else:
return content
# 写入方法
def write_json(my_list):
with open('data.json', 'w') as file:
json.dump(my_list, file)
return f'写入成功'
# 汇总所有的id
def recover_sid():
sids = []
try:
for si in read_json():
sids.append(si['sid'])
return sids
except:
return [0]
# 汇总所有的name
def recover_name():
names = []
try:
for si in read_json():
names.append(si['name'])
return names
except:
return []
class chushi(object):
def cai_lsit(self):
print("*" * 40)
print("* 学生管理系统 *")
print("* 1. 添加新学生信息 *")
print("* 2. 通过学号修改学生信息 *")
print("* 3. 通过学号删除学生信息 *")
print("* 4. 通过姓名删除学生信息 *")
print("* 5. 通过学号查询学生信息 *")
print("* 6. 通过姓名查询学生信息 *")
print("* 7. 显示所有学生信息 *")
print("* 8. 退出系统 *")
print("*" * 40)
class stu(chushi):
def add_stu(self,sids,stu_list_zong):
try:
# 创建字典 包含学生信息
add = {
'sid' : max(sids) +1, # 确定编码,永远比现有的大1
'name':input("请输入姓名:"),
'age': input("请输入年龄:"),
'gender' : input("请输入性别:")
}
stu_list_zong.append(add)
print(f"添加{ add['name']}学生成功")
print(stu_list_zong)
return stu_list_zong
except:
# 创建字典 包含学生信息
add = {
'sid': 1, # 确定编码,永远比现有的大1
'name': input("请输入姓名:"),
'age': input("请输入年龄:"),
'gender': input("请输入性别:")
}
stu_list_zong.append(add)
print(f"添加{add['name']}学生成功")
print(stu_list_zong)
return stu_list_zong
# 修改
def update_stu(self,sids,stu_list_zong):
num = input("请输入修改id:")
if int(num) in sids:
for stu_sid in stu_list_zong:
if stu_sid['sid'] == int(num):
stu_sid['name'] = input("请输入修改name:")
print('修改成功')
print(stu_list_zong)
return stu_list_zong
else:
print('此id未在学生库中,请查明id后进行修改')
# 删除sid
def del_stu_num(self,sids,stu_list_zong):
num = input("请输入修改id:")
try:
if int(num) in sids:
for stu_sid in stu_list_zong:
if stu_sid['sid'] == int(num):
index = (stu_list_zong.index(stu_sid))
del stu_list_zong[index]
print('删除成功')
else:
pass
print(stu_list_zong)
return stu_list_zong
except:
print('此id未在学生库中,请查明id后进行修改')
# 删除name
def del_stu_stu(self,names,stu_list_zong):
try:
name = input("请输入修改name:")
if name in names:
for stu_sid in stu_list_zong:
if stu_sid['name'] == name:
index = (stu_list_zong.index(stu_sid))
del stu_list_zong[index]
print('删除成功')
else:
print('此学生未在学生库中')
print(stu_list_zong)
return stu_list_zong
except:
print('此学生未在学生库中,请查明后进行修改')
# 查询sid
def select_stu_sid(self,sids,stu_list_zong):
try:
sid = input("请输入sid:")
if int(sid) in sids:
for stu_sid in stu_list_zong:
if stu_sid['sid'] == int(sid):
print(stu_sid)
print('查询成功')
else:
pass
except:
print('此学生未在学生库中,请查明后进行修改')
# 查询姓名name
def select_stu_name(self,names,stu_list_zong):
try:
name = input("请输入name:")
if name in names:
for stu_sid in stu_list_zong:
if stu_sid['name'] == name:
print('查询成功')
print(stu_sid)
return stu_sid
else:
print('此学生未在学生库中')
except:
print('此学生未在学生库中,请查明后进行修改')
# 查询姓名
def select_stu_all(self,stu_list_zong):
print(stu_list_zong)
return stu_list_zong
def start():
# 列出菜单
stus = stu()
stus.cai_lsit()
while True:
select_op = input("输入编号选择操作:")
try:
# 实现添加学生函数,函数参数为编号,姓名,年龄,性别四个参数,返回是否添加成功的结果,要求编号不可重复。
if select_op == '1':
stu_list_zong = read_json()
print(stu_list_zong)
sids = recover_sid()
print(sids)
add_stus = stu()
reps = add_stus.add_stu(sids,stu_list_zong)
write_json(reps)
#实现修改函数,参数为学号,如果学生存在,则进行修改,不存在输出提示,并返回是否修改成功
elif select_op == '2':
stu_list_zong = read_json()
print(stu_list_zong)
sids = recover_sid()
print(sids)
update_stus = stu()
reps = update_stus.update_stu(sids,stu_list_zong)
write_json(reps)
#实现删除函数,参数为学号,如果学生存在,则进行删除,不存在输出提示,并返回是否删除成功
elif select_op == '3':
stu_list_zong = read_json()
print(stu_list_zong)
sids = recover_sid()
print(sids)
del_stus = stu()
reps = del_stus.del_stu_num(sids, stu_list_zong)
write_json(reps)
# 实现删除函数,参数为姓名,如果学生存在,则进行删除(同名学生全部删除),不存在输出提示,并返回是否删除成功
elif select_op == '4':
stu_list_zong = read_json()
print(stu_list_zong)
names = recover_name()
del_stus = stu()
reps = del_stus.del_stu_stu(names,stu_list_zong)
write_json(reps)
# 实现查询函数,参数为学号,如果学生存在,则输出学生信息,不存在输出提示,并返回是否查询成功
elif select_op == '5':
stu_list_zong = read_json()
print(stu_list_zong)
sids = recover_sid()
select_stus = stu()
select_stus.select_stu_sid(sids, stu_list_zong)
# 实现查询函数,参数为姓名,如果学生存在,则输出学生信息(同名学生全部输出),不存在输出提示,并返回是否删除成功
elif select_op == '6':
stu_list_zong = read_json()
print(stu_list_zong)
names = recover_name()
select_stus = stu()
select_stus.select_stu_name(names, stu_list_zong)
# 实现函数,输出所有学生信息
elif select_op == '7':
stu_list_zong = read_json()
select_stus = stu()
select_stus.select_stu_all( stu_list_zong)
# 退出
elif select_op == '8':
break
except:
print('未输入正确的菜单号,获取菜单输入"7"')
if __name__ == '__main__':
start()
data.json
[{"sid": 1, "name": "very", "age": "21", "gender": "male"}]