韦奇_面向对象编程实战

面向对象编程实战

按面向过程函数实现的学生管理需求,将学生管理系统修改为面向对象方式实现

  • 在现有功能基础上,需将程序运行中操作的数据保存到 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"}]