Bootstrap

Python学生管理系统【原码+实现过程】

一、实现要求

  • 在面向对象编程思想完成学员管理系统的开发
  • 学生的信息要实现永久化保存
  • 系统要有如下功能:
    • 添加学生信息
    • 修改学生信息
    • 查询学生信息
    • 显示所有学生信息
    • 退出系统并保存学生信息

二、类框架的搭建

我们需要定义两个类:

  • student类,存储学生的相关信息(姓名、学号、电话号码、地址)。
  • StudentManagerSystem类 ,管理所有学生信息和操作学生信息。
1. student类定义
  • 首先该类需要完成学生信息的初始化(传参实现)。
  • 重定义魔法函数__str__,使得本来返回该对象的地址,现在改成返回该类定义的学生信息。
class Student(object):
    def __init__(self,name,num,pho,add):
        self.name = name
        self.num = num
        self.pho = pho
        self.add = add

    def __str__(self):
        return f"{self.name},{self.num},{self.pho},{self.add}"

2.StudentManagerSystem类基本框架的定义:
  • 需要定义列个列表存储学所有学生信息
  • 定义一个run函数,实现学生管理系统的相关操作。
  • run函数就是运行学生管理系统,运行后,首先我们需要在文件中加载已经存储好的学生信息。
  • 打印学生管理系统的功能菜单
  • 然后输入选项,执行相应的功能(添加、删除、查找、显示、修改、退出系统并保存)
  • 由于我们并不只进行一次操作所以我们需要对上诉两步进行循环操作,只有当选择退出系统操作后,才结束循环
class StudentManagerSystem(object):

    def __init__(self):
        self.students = []

    def run(self):

        # 加载学生信息
        self.load_student()

        while True:
            self.show_menu()

            menu_num = int(input("请选择:"))

            if menu_num == 1:
                self.add_student()
            elif menu_num == 2:
                self.del_student()
            elif menu_num == 3:
                self.alter_student()
            elif menu_num == 4:
                self.find_student()
            elif menu_num == 5:
                self.show_student()
            elif menu_num == 6:
                self.save_student()
                break
            else:
                print("input error")

三、类方法的具体实现

1.菜单函数
    def show_menu(self):
        print('*'*7 + ' <学生管理系统> ' + '*' * 7)
        print('*'*8 + ' 1.添加学生 ' + '*'*8)
        print('*'*8 + ' 2.删除学生 ' + '*'*8)
        print('*'*8 + ' 3.修改学生 ' + '*'*8)
        print('*'*8 + ' 4.查询学生 ' + '*'*8)
        print('*'*8 + ' 5.显示学生 ' + '*'*8)
        print('*'*8 + ' 6.退出系统 ' + '*'*8)
        print('*' * 26)
2.添加学生信息方法

具体实现方法:输入学生信息,用该学生信息初始化一个学生对象,然后将学生对象添加到学生管理的列表当中。

    def add_student(self):
        stu_name = input("学生姓名:")
        stu_num = input("学生学号:")
        stu_pho = input("学生电话:")
        stu_add = input('学生家庭地址:')
        stu = student.Student(stu_name, stu_num, stu_pho, stu_add)
        self.students.append(stu)  # 列表添加的是对象
3.删除学生信息
    def del_student(self):
        del_name = input("你想删除学生的姓名:")
        for i in self.students:
            if i.name == del_name:
                self.students.remove(i)
                break
            else:
                print("查无此人")
4.修改学生信息
    def alter_student(self):
        alter_name = input("输入你想修改的学生姓名:")
        for i in self.students:
            if i.name == alter_name:
                i.num = input("修改学号:")
                i.pho = input("修改电话号码:")
                i.add = input("修家庭地址:")
                print("修改成功")
                break
            else:
                print("查无此人")
5.查找学生信息
 def find_student(self):
        find_name = input("输入你想查找学生的姓名:")
        for i in self.students:
            if i.name == find_name:
                print(i.name.ljust(10,' '),i.num.ljust(4,' '),i.pho.ljust(12,' '),i.add.ljust(20,' '))
                break
            else:
                print("查无此人")
6.显示所有学生信息
    def show_student(self):
        # 小改进:调整了输出的格式
        print('name'.center(10,' '),'num'.center(4,' '),'phone'.center(12,' '),'address'.center(20,' '))
        for i in self.students:
            print(i.name.ljust(10,' '),i.num.ljust(4,' '),i.pho.ljust(12,' '),i.add.ljust(20,' '))
7.永久化保存学生信息

__dirt__的作用:

  • __dirt__在类中存放类函数、静态函数、普通函数、全局变量以及一些内置属性
  • 对象的__dict__存储了一些self.xxx的东西
  • __dirt__是一个字典

所有我们可以用对象中__dirt__来返回学生信息的字典

    def save_student(self):
        # 以w的方式打开文件
        f = open('student_info','w')
        
        new_list = [i.__dict__ for i in self.students]

        f.write(str(new_list))

        f.close()
8.加载学生信息

在我们加载学生信息的时候,由于一开始一条学生记录都没有,所以我们并未创建学生信息文件,因此我们需要使用自定义异常来避免为能打开文件的报错,进而影响程序的运行。

    def load_student(self):
        # 以读的方式打开文件 由于r的方法要保证文件是存在的
        try:
            f = open('student_info','r')
        except:
            f = open('student_info','w')
        else:
            # 将文件中的数据全部读入data中
            data = f.read()
            # 将data处理成存放字典的列表
            new_list = eval(data)
            # 将新的列表存放在self.students中
            self.students = [student.Student(i['name'],i['num'],i['pho'],i['add']) for i in new_list]
        finally:
            f.close()

四、完整代码

本次分文件编写,具体分为如下三个模块:

1. StudentManagerSystem模块
import student

class StudentManagerSystem(object):
    """
        学生的信息:姓名、学号、电话号码、家庭地址(简单就这些吧)
        采用文件编写:启动该系统的时候要将文件的信息全部读出,存入列表中
        关系系统的时候再将学生系统中的信息重新写入文件(重写 而不是追加)
        """

    def __init__(self):
        self.students = []

    def show_menu(self):
        print('*'*7 + ' <学生管理系统> ' + '*' * 7)
        print('*'*8 + ' 1.添加学生 ' + '*'*8)
        print('*'*8 + ' 2.删除学生 ' + '*'*8)
        print('*'*8 + ' 3.修改学生 ' + '*'*8)
        print('*'*8 + ' 4.查询学生 ' + '*'*8)
        print('*'*8 + ' 5.显示学生 ' + '*'*8)
        print('*'*8 + ' 6.退出系统 ' + '*'*8)
        print('*' * 26)

    def add_student(self):
        stu_name = input("学生姓名:")
        stu_num = input("学生学号:")
        stu_pho = input("学生电话:")
        stu_add = input('学生家庭地址:')
        stu = student.Student(stu_name, stu_num, stu_pho, stu_add)
        self.students.append(stu)  # 列表添加的是对象

    def show_student(self):
        # 小改进:调整了输出的格式
        print('name'.center(10,' '),'num'.center(4,' '),'phone'.center(12,' '),'address'.center(20,' '))
        for i in self.students:
            print(i.name.ljust(10,' '),i.num.ljust(4,' '),i.pho.ljust(12,' '),i.add.ljust(20,' '))

    def del_student(self):
        del_name = input("你想删除学生的姓名:")
        for i in self.students:
            if i.name == del_name:
                self.students.remove(i)
                break
            else:
                print("查无此人")

    def alter_student(self):
        alter_name = input("输入你想修改的学生姓名:")
        for i in self.students:
            if i.name == alter_name:
                i.num = input("修改学号:")
                i.pho = input("修改电话号码:")
                i.add = input("修家庭地址:")
                print("修改成功")
                break
            else:
                print("查无此人")

    def find_student(self):
        find_name = input("输入你想查找学生的姓名:")
        for i in self.students:
            if i.name == find_name:
                print(i.name.ljust(10,' '),i.num.ljust(4,' '),i.pho.ljust(12,' '),i.add.ljust(20,' '))
                break
            else:
                print("查无此人")

    def save_student(self):
        # 以w的方式打开文件
        f = open('student_info','w')

        """
        小知识:
        __dirt__ 在类中存放类函数、静态函数、普通函数、全局变量以及一些内置属性
        对象的__dict__中存储了一些self。xxx的东西
        
        """

        new_list = [i.__dict__ for i in self.students]

        f.write(str(new_list))

        f.close()

    def load_student(self):
        # 以读的方式打开文件 由于r的方法要保证文件是存在的
        try:
            f = open('student_info','r')
        except:
            f = open('student_info','w')
        else:
            # 将文件中的数据全部读入data中
            data = f.read()
            # 将data处理成存放字典的列表
            new_list = eval(data)
            # 将新的列表存放在self.students中
            self.students = [student.Student(i['name'],i['num'],i['pho'],i['add']) for i in new_list]
        finally:
            f.close()

    def run(self):

        # 加载学生信息
        self.load_student()

        while True:
            self.show_menu()

            menu_num = int(input("请选择:"))

            if menu_num == 1:
                self.add_student()
            elif menu_num == 2:
                self.del_student()
            elif menu_num == 3:
                self.alter_student()
            elif menu_num == 4:
                self.find_student()
            elif menu_num == 5:
                self.show_student()
            elif menu_num == 6:
                self.save_student()
                break
            else:
                print("input error")


# 测试代码
if __name__ == '__main__':
    student_manager = StudentManagerSystem()

    student_manager.run()
2.student模块
class Student(object):
    def __init__(self,name,num,pho,add):
        self.name = name
        self.num = num
        self.pho = pho
        self.add = add

    def __str__(self):
        return f"{self.name},{self.num},{self.pho},{self.add}"

3. main模块
from Stu_manager_system import *

if __name__ == '__main__':
    student_manager = StudentManagerSystem()

    student_manager.run()

源码下载地址

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;