学生管理系统(面向对象)V2.0

学生管理系统(面向对象)V2.0

一. 学生管理系统需求分析

学习目标

  1. 了解学生管理系统的基本需求;
  2. 了解学生管理系统的基本界面及升级改进的好处;

1. [了解]基本需求

使用面向对象、字符串、列表、字典、文件等知识点来完成一个学生管理系统V2.0

针对学生,该系统具有添加、修改、删除、查询所有学生、查询某个学生、保存信息、退出系统等操作。

升级目的:

1:提升项目的整体维护性,对项目进行升级;
2:升级技术点:保存文件信息(持久化存储)、面向对象。

简单的操作流程图如下:

在这里插入图片描述

对于本学生管理系统所具有的基本需求如下:

a.可以显示基本的版本信息和操作界面;
	A:显示版本
    B:显示操作界面.
b.可以通过键盘输入一些信息来完成基本功能,例如选择序号、确认退出、添加学生、修改信息等;
	A:选择序号、确认退出等操作,应该是局部功能;
	B:[添加学生、修改信息等]应该是操作对象   --一切皆对象!
c.学生属性信息有姓名、性别、年龄、联系方式、描述信息等;
	A:定义类,类由属性和方法组成;
	B:快速初始化: __init__()
	C:输出对象名时展示学生信息:__str__()
d.使用系统可对学生信息进行添加、修改、删除、查询等操作;
	A:使用比较简单的方式完成功能:列表、学生对象;
	B:列表的操作:
		1:添加 append(对象)
		2:修改 变量名[索引值] = 学生对象
		3:删除 remove(对象)
		4:查询 循环:对象 == 展示学生信息:__str__()
e.可以使用文件对学生信息进行加载、保存等;
	A:学生信息存放在列表中,列表中学生对象: [Student对象1,Student对象2,...]  <..Student object at 0x23xxxxx>
	B:最好要把学生对象转换为Python字典; [{name:xx,...},{name:xx,...},...]
	C:保存  写入数据
	D:加载  读取
f.可重复对学生进行增删查改操作,当确认退出系统后,则直接退出系统;
	A:反复多次执行;
	B:退出:跳出循环  break
g.请使用面向对象的编程思想完成项目的升级处理。
	A:明确:一切皆对象;
	B:类:学生类  学生管理系统类
	C:使用面向对象思维方式来分析问题: "三步走"
		1:有哪些类?
			学生类
			学生管理系统类
		2:这些类有哪些属性和行为?
			学生类
				属性:姓名、性别、年龄、联系方式、描述信息
				行为:?
			学生管理系统类
				属性:存储学生的变量属性
				行为:增删查改、保存信息、退出系统、加载信息等
		3:这些类和类之间有什么联系?
			学生管理系统操作学生。

2. [了解]界面及项目改进

操作本管理系统显示的界面如下:
在这里插入图片描述

在上面的操作界面可以选中操作序号进行详细操作。

二. 项目开发实践

学习目标

  1. 知道如何定义程序入口文件;
  2. 知道使用面向对象属性和方法;
  3. 知道魔法方法__init__()和__str__()的使用;
  4. 知道该如何执行学生的新增操作;
  5. 知道该如何执行学生的修改操作;
  6. 知道该如何执行学生的删除操作;
  7. 知道该如何执行学生的查询操作;
  8. 了解文件的加载与保存操作。

1. [重点]程序入口文件main

提示:

项目总程序入口是main.py,是整个项目的程序入口。

例如,需要完成定义程序主入口的功能:

(1)创建一个程序入口文件;

(2)定义程序功能的一个主入口;

(3)启动学生管理系统程序。

1:[避开问题]定义模块(全英文字母)、代码尽可能规范化;
2:测试if name == …,继续执行; --入口文件:main.py
3:调用虚拟-"学生管理系统类"的启动功能。

main.py

from studentcms import StudentCMS

__name__ = '__main__'
# print("程序入口")
# 对象名 = 类名()
studentcms = StudentCMS()
# 对象名.方法名()
studentcms.start()

studentcms.py

# 操作学生管理系统模块
class StudentCMS(object):
    def start(self):
        """启动程序"""
        print("开始启动系统")

2. [重点]学生类文件student

对于学生类,属性有姓名、年龄、性别、联系方式、描述信息,使用面向对象写类。

例如,需要完成输出学生对象的功能:

(1)定义一个存放学生类的模块文件;

(2)在模块中定义一个学生类;

(3)在类中使用__init__()初始化学生的属性;

(4)在类中使用__str__()方法输出对象信息。

1:[注意]定义模块名:所有字母均小写; 类名:大驼峰命名法,所有单词首字母大写,其余字母均小写;
2:初始化属性:有参数的init(),初始化;
3:输出对象名时,要输出对象信息.

在这里插入图片描述

代码如下:

# 操作学生模块
class Student(object):
    def __init__(self, name, gender, age, mobile, text):
        """
        初始化学生属性!
        :param name: 姓名
        :param gender: 性别
        :param age: 年龄
        :param mobile: 联系方式
        :param text: 描述信息
        """
        self.name = name
        self.gender = gender
        self.age = age
        self.mobile = mobile
        self.text = text

    pass

    def __str__(self):
        """当显示所有学生时,直接输出对象名:输出学生的信息"""
        return f"{self.name},{self.gender},{self.age},{self.mobile},{self.text}"

3. 具体业务功能studentcms

1:增删查改
2:退出系统
3:加载、保存信息

3.1 [重点]显示界面

用于显示学生信息的操作界面内容。

在这里插入图片描述

例如,需要完成显示操作界面的功能:

(1)显示项目的升级后版本信息; 1.0 - 2.0

(2)模拟启动项目; - 用户等待

(3)显示项目的大体操作界面,以便提示用户如何操作。 -界面

1:[启动]studentcms.py - StudentCMS类 -> start()启动;
2:显示版本;
3:提升用户体验,sleep();
4:显示界面。

# 操作学生管理系统模块
import time

class StudentCMS(object):

    @staticmethod
    def show_view():
        print("*" * 30)
        print("本学生管理系统V2.0可完成如下操作:")
        print("\t【1】添加学生;")
        print("\t【2】修改学生;")
        print("\t【3】删除学生;")
        print("\t【4】查询学生;")
        print("\t【5】显示所有学生;")
        print("\t【6】保存信息;")
        print("\t【0】退出系统;")
        print("*" * 30)
        pass

    def start(self):
        """用于启动系统"""
        # print("开始启动系统...")
        # 显示版本
        print("-"*30)
        print("\t传智教育学生管理系统V2.0")
        print("-"*30)

        # 模拟启动
        print("正在玩命加载中,请稍后...")
        time.sleep(1)

        # 显示界面  --灵活运用
        # self.方法名()
        self.show_view()
3.2 [重点]搭建项目基本框架

为了便于后期快速开发,一般在项目初期我们会根据项目开发需求进行搭建基本项目框架,以便于更高效的快速开发。

例如,需要完成搭建项目基本框架的功能:

(1)用户可以通过键盘输入操作序号;

(2)在不同的序号下,可以执行不同的功能;

(3)用户可能不按照要求输入相应的序号,应该也要考虑下程序的稳定性。

1:[注意]显示完操作界面后,用户可以自由输入序号;
2:不同的操作序号,执行不同功能; --定义方法: self.方法名()

# 操作学生管理系统模块
import time
from student import Student


# 方式二
# import student


class StudentCMS(object):
    @staticmethod
    def show_view():
        print("*" * 30)
        print("本学生管理系统V2.0可完成如下操作:")
        print("\t【1】添加学生;")
        print("\t【2】修改学生;")
        print("\t【3】删除学生;")
        print("\t【4】查询学生;")
        print("\t【5】显示所有学生;")
        print("\t【6】保存信息;")
        print("\t【0】退出系统;")
        print("*" * 30)
        pass

    def start(self):
        """启动程序"""
        # print("开始启动程序")
        # 显示版本
        print("-" * 30)
        print("\t传智教育学生管理系统2.0")
        print("-" * 30)

        # 模拟启动
        print("正在加载中...")
        time.sleep(1)
        self.show_view()

        while True:
            while True:
                num = input("请输入您要选择的序号:")
                if num.isdigit():
                    option = int(num)
                    break
                else:
                    print("您输入的不是数字,请输入数字")
            if option == 1:
                print("----添加学生----")
                self.add_student()
            elif option == 2:
                print("----修改学生----")
                self.modify_student()
            elif option == 3:
                print("----删除学生----")
                self.del_student()
            elif option == 4:
                print("----查询学生----")
                self.query_student()
            elif option == 5:
                print("----显示所有学生----")
                self.show_all_student()
            elif option == 6:
                print("----保存信息----")
                self.save_student_file()
            elif option == 0:
                print("----退出系统----")
            else:
                print("请输入1-6的值,输入有误~~~")

    def add_student(self):
        """添加学生"""
        pass

    def modify_student(self):
        """修改学生"""
        pass

    def del_student(self):
        """删除学生"""
        pass

    def query_student(self):
        """查询学生"""
        pass

    def show_all_student(self):
        """显示所有学生"""
        pass

    def save_student_file(self):
        """保存学生信息"""
        pass
3.3 [重点]退出系统

首先,我们来完成项目操作的退出功能。当然,在退出前必须要能反复多次显示操作界面。

例如,需要完成退出系统的功能:

(1)能反复多次的选择操作序号来执行功能;

(2)用户想要退出时,可输入Y或y后退出系统的继续执行。

1:[注意]A:当用户输入0退出; B:显示操作界面前,完成反复多次操作;
2:反复多次操作:不知道次数,死循环;
3:死循环后要退出:当用户输入0退出,break.

在这里插入图片描述

            elif option == 0:
                print("----退出系统----")
                out_strs = input("请确认是否真的退出(Y/N):\n")
                if out_strs == "y" or out_strs == "Y":
                    print("正在退出系统")
                    time.sleep(2)
                    print("您已退出学生管理系统,欢迎下次继续登录使用")
                    break  # (跳出上一级循环)
                    # 跳出最上一级循环
                    # return False
3.4 [了解]数据格式,并定义方法与属性

在操作学生的新增、修改、删除、查询操作前,要优先考虑数据格式是怎样的,且要考虑项目的整体结构,这样可以更加高效的快速开发项目的相关功能。

例如,需要完成如下功能:

(1)为便于后期开发与维护,新增、修改、删除、查询等操作都可以使用面向对象中的方法形式处理;

(2)思考:存储学生数据的样式该是怎样的,才能更好的完成开发呢?一切皆对象!

(3)在系统操作前,可以先默认让系统已有3名学生,便于测试系统的其他功能;

(4)例如,学生信息有姓名、性别、年龄、联系方式、描述信息等属性。

1:[思考1]把数据内容保存到文件中,内容类型:文本类型 str字符串; 读r 写w
list -> str: “[{“name”:“xxx”,“age”:xx,…},{“name”:“xxx”,“age”:xx,…},…]”
2:[思考2]把学生信息存放到列表中,最便捷,“一切皆对象”
list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]
3:[写]把学生信息放在学生管理系统类中;
4:[写]全局变量(处理不方便);类是由属性和方法组成; ==>使用属性来存储;
5:[要求]默认3名学生,属性中存储有3名学生.

from student import Student


# 方式二
# import student


class StudentCMS(object):
    def __init__(self):
        student1 = Student("小陈", "男", 24, "123", "前端工程师")
        student2 = Student("小张", "男", 25, "313", "大数据工程师")
        student3 = Student("小莹", "女", 23, "152", "水利工程师")
        # 方式二
        # student1 = student.Student("小陈", "男", 24, "123", "前端工程师")
        # student2 = student.Student("小张", "男", 25, "313", "大数据工程师")
        # student3 = student.Student("小莹", "女", 23, "152", "水利工程师")
        self.student_lists = [student1, student2, student3]
        # print(self.student_lists)
        pass
3.5 [重点]添加学生

接着,我们一起来完成项目操作的新增、修改、删除、查询等具体功能吧!

例如,需要完成添加一个学生的功能:

(1)用户选择添加学生的功能后,能用于添加一个学生信息到系统中; –把一个学生对象添加到属性~

(2)用户可按要求输入学生的相关信息,例如姓名、性别、年龄、联系方式、描述信息等;

(3)可以将用户输入的正确的完整学生信息以对象形式添加到系统中。

1:[注意]用户输入序号1时,就开始添加学生;
2:输入学生的信息:例如姓名、性别、年龄、联系方式、描述信息等;
3:把信息转换为一个学生对象; --一切皆对象
4:输出属性信息。 输出整个列表! list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]

    def add_student(self):
        """添加学生"""
        in_name = input("请输入要添加的姓名:")
        in_gender = input("请输入要添加的性别:")
        in_age = int(input("请输入要添加的年龄(int):"))
        in_mobile = input("请输入要添加的联系方式:")
        in_text = input("请输入要添加的描述信息:")
        student = Student(in_name, in_gender, in_age, in_mobile, in_text)
        print(student)
        print(f"-----{student}")
        print("-------------------")
        self.student_lists.append(student)
        # 方式二:
        # student4 = student.Student(in_name, in_sex, in_age, in_mobile, in_description)
        # print(student4)
        # print(f"-----{student4}")
        # print("-------------------")
        # self.student_lists.append(student4)
        print("=====学生信息已添加成功=======")
        print(self.student_lists)
        pass
3.6 [重点]显示所有学生

当进入学生管理系统项目后,可以显示系统内的所有学生信息,便于查询结果。

例如,需要完成显示学生所有信息的功能:

(1)查询所有信息的本质,其实就是循环遍历存放在属性中的所有学生信息; --对象:重写__str__()了,输出就是str后的结果.

(2)按照学生的不同信息字段来依次显示出来。

1:[注意]用户输入序号5,显示所有学生;
2:先显示标题信息;
3:循环属性,显示对象信息。 list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]

在这里插入图片描述

    def show_all_student(self):
        """显示所有学生"""
        print("姓名\t性别年龄\t电话\t描述信息")
        for student in self.student_lists:
            print(student)
        pass
3.7 [重点]查询某个学生

有时,想要查询系统内的某个学生信息并显示出来。

例如,需要完成查询某个学生的功能:

(1)可根据学生姓名来查找学生信息;

(2)显示出查询姓名的所有结果信息。

1:[注意]用户输入序号4,可以查询某个学生;
2:循环所有学生,找到"李圣华"同学信息,显示结果;
3:有"小"字都能找出来. --莹!

    def query_student(self):
        """查询学生"""
        query_name = input("请输入您需要查询的学生姓名:")
        for student in self.student_lists:
            if query_name in student.name:
                print(student)
        pass

在这里插入图片描述

3.8 [了解]保存信息

说明:

1:一个基础知识:列表推导式;
2:一个知识点:如何把对象快速变成一个字典
3:数据持久化处理,把学生信息保存到文件中

3.8.1列表推导式

列表推导式:把一些算法直接保存到一个表达式中。对列表操作进行简化!

例如,我们要创建一个0-4的数值的列表。

1:普通方式:建空列表、循环、添加值;
2:[简化处理]使用列表推导式完成.

语法格式:

[变量名 for xx in 序列]

# 1
# lists1 = []
# for temp in range(0,5):
#     # print(temp)
#     lists1.append(temp)
# print(f"结果:{lists1}")

# 2
lists = [temp for temp in range(0,5)]
print(lists)
3.8.2 如何把对象快速变成一个字典

==简化:==若要把一个对象名的所有信息转换为一个字典类型的结果:

对象名.dict

例如,有个用户类,用户名、密码。 -->快速转换为字典?

1:普通方式:获取出对象里的属性值、存放到一个字典中;
2:[简化]使用"对象名.dict"完成.

# 定义类
class User(object):
    def __init__(self,username,password):
        self.username = username
        self.password = password

# 转换
# 1
# user = User("admin","123456")
# user_dicts = {}
# user_dicts["username"] = user.username
# user_dicts["password"] = user.password
# print(f"转换的结果:{user_dicts}")

# 2
user = User("admin","123456")
user_dicts = user.__dict__
print(f"结果:{user_dicts}")
3.8.3 把学生信息保存到文件

当选择"保存信息"时,可以将所有的学生信息保存到文件中。

例如,需要完成保存学生信息的功能:

(1)将学生对象转换为字典类型的数据;

(2)把字典类型的学生信息放入列表;

(3)把列表数据进行类型转换为字符串类型;

(4)把字符串类型的结果写入到文件中。

A:把学生信息存放到列表中,最便捷,“一切皆对象”
list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]
B:把数据内容保存到文件中,内容类型:文本类型 str字符串; 读r 写w
对象 -> 字典: <xxx.Student object at 0x1212xxx> -->{“name”:“xxx”,“age”:xx,…} 对象名.dict
=====>list:[{“name”:“xxx”,“age”:xx,…},{“name”:“xxx”,“age”:xx,…},…]
list -> str: “[{“name”:“xxx”,“age”:xx,…},{“name”:“xxx”,“age”:xx,…},…]”

[{'name': '小陈', 'gender': '男', 'age': 24, 'mobile': '123', 'text': '前端工程师'}, {'name': '小张', 'gender': '男', 'age': 25, 'mobile': '313', 'text': '大数据工程师'}, {'name': '小莹', 'gender': '女', 'age': 23, 'mobile': '152', 'text': '水利工程师'}]

问题:

给存放学生信息的文件保存为:xxx.data

    def save_student_file(self):
        """保存学生信息"""
        # print(self.student_lists)
        datas = [student.__dict__ for student in self.student_lists]
        file = open("student.data", "w", encoding="utf-8")
        datas_strs = str(datas)
        file.write(datas_strs)
        file.close()
        print("数据信息已保存完成!!!")
        pass
3.9 [了解]文件加载学生数据信息

说明:

1:APP启动时,延时或广告提示; -->需要时间
2:在这段时间内,APP内部执行什么操作? 系统做了什么? -->【资源加载!】

我们知道,上述保存学生数据信息到了文件中,数据样式如下:

[{‘name’: ‘小陈’, ‘gender’: ‘男’, ‘age’: 24, ‘mobile’: ‘123’, ‘text’: ‘前端工程师’}, {‘name’: ‘小张’, ‘gender’: ‘男’, ‘age’: 25, ‘mobile’: ‘313’, ‘text’: ‘大数据工程师’}, {‘name’: ‘小莹’, ‘gender’: ‘女’, ‘age’: 23, ‘mobile’: ‘152’, ‘text’: ‘水利工程师’}]

而当启动学生管理系统时,为便于进行操作学生信息,则可以直接初始化或加载数据文件中的信息。

例如,需要完成加载学生信息的功能:

(1)判定学生信息文件是否存在?若不存在,则要求先创建该文件;否则直接加载数据即可; ??try-except

(2)思考:当第1次启动系统时,数据文件中是没有数据的,该怎么做才能避免下一步的类型转换错误呢? 设置默认为:[]

(3)把加载完成的学生信息数据存放到属性中。 list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]

A:把数据内容保存到文件中,内容类型:文本类型 str字符串; 读r 写w
对象 -> 字典: <xxx.Student object at 0x1212xxx> -->{“name”:“xxx”,“age”:xx,…} 对象名.dict
=====>list:[{“name”:“xxx”,“age”:xx,…},{“name”:“xxx”,“age”:xx,…},…]
list -> str: “[{“name”:“xxx”,“age”:xx,…},{“name”:“xxx”,“age”:xx,…},…]”
B:把学生信息存放到列表中,最便捷,“一切皆对象”
list: [<xxx.Student object at 0x1212xxx>,Student对象2,Student对象3,…]

        def load_student_file(self):
        """加载学生信息"""
        try:
            file = open("student.data", "r", encoding="utf-8")
        except Exception:
            file = open("student.data", "w", encoding="utf-8")
        # file=open("student.data","r",encoding="utf-8")
        else:
            texts = file.read()
            if len(texts) == 0:
                texts = "[]"
                # print(texts)
            # print(type(texts))
            texts_list = eval(texts)
            # print(type(texts_list))
            # print(texts_list)
            # print(f"启动系统后,数据内容有:{texts_list[0]}")
            self.student_lists = [
                Student(student_attribute["name"], student_attribute["gender"], student_attribute["age"],
                        student_attribute["mobile"], student_attribute["text"]) for student_attribute in texts_list]
            # 输出结果
            # print(f"启动系统后,数据内容有:{self.student_lists}")
            file.close()
3.10 [重点]修改学生

因核对学生信息后,发现某学生的信息在系统中显示有误,此时就要对信息进行修改。

例如,需要完成修改某个学生信息的功能:

(1)输入待修改的学生姓名,并查询是否有该学生;

(2)根据学生姓名来修改学生的相关信息。

    def modify_student(self):
        """修改学生"""
        update_name = input("请输入要修改的姓名:")
        for student in self.student_lists:
            if student.name == update_name:
                student.name = input("请输入要修改的姓名:")
                student.gender = input("请输入要修改的性别:")
                student.age = int(input("请输入要修改的年龄(int):"))
                student.mobile = input("请输入要修改的联系方式:")
                student.text = input("请输入要修改的描述信息:")
                print("修改已完成")
                print(student)
                return False
        else:
            print("未找到需要修改人的信息")
        pass
3.11 [重点]删除学生

因该学生已毕业,为提升系统内信息的准确度,此时就要对学生信息进行删除。

例如,需要完成删除某个学生信息的功能:

(1)输入待删除的学生姓名,并查询是否有该学生;

(2)根据学生姓名来删除学生的相关信息。

    def del_student(self):
        """删除学生"""
        delete_name = input("请输入需要删除的姓名:")
        for student in self.student_lists:
            # if student["name"] == delete_name:
            if student.name == delete_name:
                print(f"查询出的结果{student}")
                # student_datas.remove(delete_name)
                self.student_lists.remove(student)
                print("删除已完成")
                return False
        else:
            print("未找到需要删除人的信息")
        pass

三. 整个项目代码

1. main.py文件代码

from studentcms import StudentCMS

__name__ = '__main__'
# print("程序入口")
# 对象名 = 类名()
studentcms = StudentCMS()
# 对象名.方法名()
studentcms.start()

2. student.py文件代码

class Student(object):
    def __init__(self, name, gender, age, mobile, text):
        """
        初始化学生属性!
        :param name: 姓名
        :param gender: 性别
        :param age: 年龄
        :param mobile: 联系方式
        :param text: 描述信息
        """
        self.name = name
        self.gender = gender
        self.age = age
        self.mobile = mobile
        self.text = text

    pass

    def __str__(self):
        """当显示所有学生时,直接输出对象名:输出学生的信息"""
        return f"{self.name},{self.gender},{self.age},{self.mobile},{self.text}"

3. studentscm.py文件代码

import time
from student import Student


# 方式二
# import student


class StudentCMS(object):
    def __init__(self):
        student1 = Student("小陈", "男", 24, "123", "前端工程师")
        student2 = Student("小张", "男", 25, "313", "大数据工程师")
        student3 = Student("小莹", "女", 23, "152", "水利工程师")
        # 方式二
        # student1 = student.Student("小陈", "男", 24, "123", "前端工程师")
        # student2 = student.Student("小张", "男", 25, "313", "大数据工程师")
        # student3 = student.Student("小莹", "女", 23, "152", "水利工程师")
        self.student_lists = [student1, student2, student3]
        # print(self.student_lists)
        pass

    @staticmethod
    def show_view():
        print("*" * 30)
        print("本学生管理系统V2.0可完成如下操作:")
        print("\t【1】添加学生;")
        print("\t【2】修改学生;")
        print("\t【3】删除学生;")
        print("\t【4】查询学生;")
        print("\t【5】显示所有学生;")
        print("\t【6】保存信息;")
        print("\t【0】退出系统;")
        print("*" * 30)
        pass

    def start(self):
        """启动程序"""
        # print("开始启动程序")
        # 显示版本
        print("-" * 30)
        print("\t传智教育学生管理系统2.0")
        print("-" * 30)

        # 模拟启动
        print("正在加载中...")
        # self.save_student_file()
        self.load_student_file()
        time.sleep(1)
        self.show_view()

        while True:
            while True:
                num = input("请输入您要选择的序号:")
                if num.isdigit():
                    option = int(num)
                    break
                else:
                    print("您输入的不是数字,请输入数字")
            if option == 1:
                print("----添加学生----")
                self.add_student()
            elif option == 2:
                print("----修改学生----")
                self.modify_student()
            elif option == 3:
                print("----删除学生----")
                self.del_student()
            elif option == 4:
                print("----查询学生----")
                self.query_student()
            elif option == 5:
                print("----显示所有学生----")
                self.show_all_student()
            elif option == 6:
                print("----保存信息----")
                self.save_student_file()
            elif option == 0:
                print("----退出系统----")
                out_strs = input("请确认是否真的退出(Y/N):\n")
                if out_strs == "y" or out_strs == "Y":
                    print("正在退出系统")
                    time.sleep(2)
                    print("您已退出学生管理系统,欢迎下次继续登录使用")
                    break  # (跳出上一级循环)
                    # 跳出最上一级循环
                    # return False
            else:
                print("请输入1-6的值,输入有误~~~")

    def add_student(self):
        """添加学生"""
        in_name = input("请输入要添加的姓名:")
        in_gender = input("请输入要添加的性别:")
        in_age = int(input("请输入要添加的年龄(int):"))
        in_mobile = input("请输入要添加的联系方式:")
        in_text = input("请输入要添加的描述信息:")
        student = Student(in_name, in_gender, in_age, in_mobile, in_text)
        print(student)
        print(f"-----{student}")
        print("-------------------")
        self.student_lists.append(student)
        # 方式二:
        # student4 = student.Student(in_name, in_sex, in_age, in_mobile, in_description)
        # print(student4)
        # print(f"-----{student4}")
        # print("-------------------")
        # self.student_lists.append(student4)
        print("=====学生信息已添加成功=======")
        print(self.student_lists)
        pass

    def modify_student(self):
        """修改学生"""
        update_name = input("请输入要修改的姓名:")
        for student in self.student_lists:
            if student.name == update_name:
                student.name = input("请输入要修改的姓名:")
                student.gender = input("请输入要修改的性别:")
                student.age = int(input("请输入要修改的年龄(int):"))
                student.mobile = input("请输入要修改的联系方式:")
                student.text = input("请输入要修改的描述信息:")
                print("修改已完成")
                print(student)
                return False
        else:
            print("未找到需要修改人的信息")
        pass

    def del_student(self):
        """删除学生"""
        delete_name = input("请输入需要删除的姓名:")
        for student in self.student_lists:
            # if student["name"] == delete_name:
            if student.name == delete_name:
                print(f"查询出的结果{student}")
                # student_datas.remove(delete_name)
                self.student_lists.remove(student)
                print("删除已完成")
                return False
        else:
            print("未找到需要删除人的信息")
        pass

    def query_student(self):
        """查询学生"""
        query_name = input("请输入您需要查询的学生姓名:")
        for student in self.student_lists:
            if query_name in student.name:
                print(student)
        pass

    def show_all_student(self):
        """显示所有学生"""
        print("姓名\t性别年龄\t电话\t描述信息")
        for student in self.student_lists:
            print(student)
        pass

    def save_student_file(self):
        """保存学生信息"""
        # print(self.student_lists)
        datas = [student.__dict__ for student in self.student_lists]
        file = open("student.data", "w", encoding="utf-8")
        datas_strs = str(datas)
        file.write(datas_strs)
        file.close()
        print("数据信息已保存完成!!!")
        pass

    def load_student_file(self):
        """加载学生信息"""
        try:
            file = open("student.data", "r", encoding="utf-8")
        except Exception:
            file = open("student.data", "w", encoding="utf-8")
        # file=open("student.data","r",encoding="utf-8")
        else:
            texts = file.read()
            if len(texts) == 0:
                texts = "[]"
                # print(texts)
            # print(type(texts))
            texts_list = eval(texts)
            # print(type(texts_list))
            # print(texts_list)
            # print(f"启动系统后,数据内容有:{texts_list[0]}")
            self.student_lists = [
                Student(student_attribute["name"], student_attribute["gender"], student_attribute["age"],
                        student_attribute["mobile"], student_attribute["text"]) for student_attribute in texts_list]
            # 输出结果
            # print(f"启动系统后,数据内容有:{self.student_lists}")
            file.close()

4. 测试代码运行结果

C:\软件\python-jupyter\python.exe "F:/Big data Project/demo01/学生管理系统V2.0/main.py"
------------------------------
	传智教育学生管理系统2.0
------------------------------
正在加载中...
******************************
本学生管理系统V2.0可完成如下操作:1】添加学生;2】修改学生;3】删除学生;4】查询学生;5】显示所有学生;6】保存信息;0】退出系统;
******************************
请输入您要选择的序号:5
----显示所有学生----
姓名	性别年龄	电话	描述信息
小陈,,24,123,前端工程师
小张,,25,313,大数据工程师
小莹,,23,152,水利工程师
请输入您要选择的序号:1
----添加学生----
请输入要添加的姓名:小曹
请输入要添加的性别:男
请输入要添加的年龄(int):25
请输入要添加的联系方式:156
请输入要添加的描述信息:是胖胖的小伙子
小曹,,25,156,是胖胖的小伙子
-----小曹,,25,156,是胖胖的小伙子
-------------------
=====学生信息已添加成功=======
[<student.Student object at 0x00000215E5DE5B38>, <student.Student object at 0x00000215E5DE5B70>, <student.Student object at 0x00000215E5DE5BA8>, <student.Student object at 0x00000215E5746630>]
请输入您要选择的序号:5
----显示所有学生----
姓名	性别年龄	电话	描述信息
小陈,,24,123,前端工程师
小张,,25,313,大数据工程师
小莹,,23,152,水利工程师
小曹,,25,156,是胖胖的小伙子
请输入您要选择的序号:2
----修改学生----
请输入要修改的姓名:小陈
请输入要修改的姓名:小王
请输入要修改的性别:男
请输入要修改的年龄(int):24
请输入要修改的联系方式:345
请输入要修改的描述信息:工程师
修改已完成
小王,,24,345,工程师
请输入您要选择的序号:5
----显示所有学生----
姓名	性别年龄	电话	描述信息
小王,,24,345,工程师
小张,,25,313,大数据工程师
小莹,,23,152,水利工程师
小曹,,25,156,是胖胖的小伙子
请输入您要选择的序号:3
----删除学生----
请输入需要删除的姓名:小王
查询出的结果小王,,24,345,工程师
删除已完成
请输入您要选择的序号:5
----显示所有学生----
姓名	性别年龄	电话	描述信息
小张,,25,313,大数据工程师
小莹,,23,152,水利工程师
小曹,,25,156,是胖胖的小伙子
请输入您要选择的序号:4
----查询学生----
请输入您需要查询的学生姓名:小
小张,,25,313,大数据工程师
小莹,,23,152,水利工程师
小曹,,25,156,是胖胖的小伙子
请输入您要选择的序号:4
----查询学生----
请输入您需要查询的学生姓名:莹
小莹,,23,152,水利工程师
请输入您要选择的序号:6
----保存信息----
数据信息已保存完成!!!
请输入您要选择的序号:0
----退出系统----
请确认是否真的退出(Y/N):
y
正在退出系统
您已退出学生管理系统,欢迎下次继续登录使用

Process finished with exit code 0

5. 自动生成student.data文件,并保存如下信息

[{'name': '小张', 'gender': '男', 'age': 25, 'mobile': '313', 'text': '大数据工程师'}, {'name': '小莹', 'gender': '女', 'age': 23, 'mobile': '152', 'text': '水利工程师'}, {'name': '小曹', 'gender': '男', 'age': 25, 'mobile': '156', 'text': '是胖胖的小伙子'}]

在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据-Amadeus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值