首页 > 编程语言 >day11 学生管理系统python版本

day11 学生管理系统python版本

时间:2023-01-24 01:33:34浏览次数:44  
标签:__ name 管理系统 python self 学生 stu day11 id

学生管理系统Python版本

student.py

'''
这个是学生模块,用来实现学生模型类的定义
保存学生信息
'''


class Student(object):

    # 定义一个初始化方法,定义学生信息属性
    def __init__(self, stu_id, stu_name, stu_age):
        self.stu_id = stu_id
        self.stu_name = stu_name
        self.stu_age = stu_age

    # 格式化对象
    def __str__(self):
        return '| ' + self.stu_id.ljust(5) + self.stu_name.center(10) + self.stu_age.rjust(3) + ' |'


# 当前模块的测试代码
if __name__ == '__main__':
    tom = Student('1', 'Tom', '12')
    print(tom)

main.py

'''
主程序文件,用来实现程序的入口
'''


# 导入学生管理模块
from student_manager import *


if __name__ == '__main__':

    # 使用学生管理类创建一个学生管理对象
    sms = StudentManagerSystem()
    # 通过start() 方法,启动程序
    sms.start()

StudentManagerSystem.py

'''
这个模块用来实现学生管理类
主要负责学生管理的增删改查等操作的逻辑实现
'''

from student import Student


class StudentManagerSystem(object):

    def __init__(self):
        # 定义一个容器属性,用来保存所有被管理的学生
        # 容器是一个字典类型
        # 容器的元素值  学生ID: 学生对象
        self.students = {}

        # 加载数据
        self.__load_data()

    # start() 方法是用来启动该管理系统的公有接口方法
    def start(self):
        print('系统启动成功')

        # 循环执行
        while True:
            # 打印菜单
            self.__print_menu()
            # 输入要执行的id
            selecd_id = input('请输入要选择功能的ID:')

            # 判断,如果输入的ID,不在范围内,那么执行输入
            if selecd_id.isdigit():
                # 如果是数字字符串,那么转换成数字,方便后面的判断
                n = int(selecd_id)
                # 判断是否在有效范围内
                if n >= 0 and n <= 5:
                    # 执行操作方法
                    self.__operator(selecd_id)
                else:
                    print('超出功能ID范围,重新输入')
            else:
                print('输入了非法功能,请重新输入')

    # 打印菜单的方法
    def __print_menu(self):
        print("*" * 30)
        print("欢迎使用【学生管理系统】 V1.0")
        print("1.添加学生")
        print("2.显示全部")
        print("3.查询学生")
        print("4.修改学生")
        print("5.删除学生")
        print("0.退出系统")
        print("*" * 30)

    # 用来执行操作的方法
    # 实现管理的代码逻辑
    def __operator(self, selecd_id):
        print('选择了功能 ', selecd_id)
        # 在这个功能里,需要根据接收的ID来选择相应功能执行
        # 将功能的ID和字典做一个映射关系,每一个ID和函数名做为键值对保存到字典中

        method_dict = {'1': self.__add_student,
                       '3': self.__search_stu_with_id,
                       '4': self.__modify_student_with_id,
                       '2': self.__show_all_info,
                       '5': self.__remove_student_with_id,
                       '0': exit}

        # 通过接收的ID,在字典中去找到相应的方法,并执行
        method = method_dict[selecd_id]

        # 判断,有id参数的方法,通过if后代码执行
        if selecd_id == '3' or selecd_id == '4' or selecd_id == '5':
            # 输入一个要操作的学生ID,并传给相应的学生
            stu_id = input('请输入要操作的学生ID:')
            method(stu_id)
        # 所有无参的方法,都在这里执行
        else:
            # 如果功能ID是0,表示要退出程序,
            # 退出程序前先要保存数据,写入文件
            if selecd_id == '0':
                self.__save_data()

            method()

    # 添加学生的方法
    def __add_student(self):
        print('添加学生')
        # 通过输入获取学生的信息
        stu_info = self.__input_stu_info()
        # 创建一个学生对象,保存学生的信息
        stu = Student(stu_info[0], stu_info[1], stu_info[2])
        # 加到学生字典中
        self.students[stu.stu_id] = stu
        # self.students[stu_info[0]] = stu

        # print(self.students)

    # 查找学生的方法
    # 方法有个返回值,返回查找到的学生
    def __search_stu_with_id(self, stu_id):
        print(stu_id)
        # 给学生定义一个默认值为空,默认是找不到学生
        stu = None

        # 通过参数id在字典中进行判断,如果id存在,那么就通过id找到这个学生
        if stu_id in self.students:
            stu = self.students[stu_id]

            # stu = self.students.get(stu_id)

            # 显示学生信息
            self.__show_stu_info(stu)
        else:
            print(f'ID为 {stu_id} 的学生不存在')

        # 将找到的学生返回
        return stu

    # 修改学生信息
    def __modify_student_with_id(self, stu_id):
        # 打印修改学生ID
        print('要修改的学生是 ', stu_id)

        # 先查找学生
        stu = self.__search_stu_with_id(stu_id)

        # 判断,如果找到学生就修改,没找到就不修改
        if stu != None:
            # 获取新数据
            new_stu_info = self.__input_stu_info()

            # 修改
            stu.stu_id = new_stu_info[0]
            stu.stu_name = new_stu_info[1]
            stu.stu_age = new_stu_info[2]
            print('修改完成')
            self.__show_stu_info(stu)
        else:
            print('要修改的学生', stu_id, '不存在')

    # 删除学生信息
    def __remove_student_with_id(self, stu_id):
        # 调用查找 方法查询 学生
        stu = self.__search_stu_with_id(stu_id)

        # 判断如果查找到学生就删除
        if stu:
            self.students.pop(stu_id)
        # else:
        #     print('没找着')

    # 显示单个学生的信息
    def __show_stu_info(self, stu):
        print(stu)

    # 显示所有学生信息
    def __show_all_info(self):
        # 遍历 打印
        for stu in self.students.values():
            # print(stu)
            self.__show_stu_info(stu)

    # 获取学生信息的方法
    # 返回一个学生的信息
    def __input_stu_info(self):
        stu_id = input('请输入学生的ID:')
        stu_name = input('请输入学生的姓名:')
        stu_age = input('请输入学生的年龄:')
        return stu_id, stu_name, stu_age

    # 添加两个方法,用来读取数据和退出程序时保存数据
    def __save_data(self):
        print('保存数据')
        # 以行的形式来保存每一个学生的信息

        # 以写的方式打开一个文件
        file_w = open('data', 'w')

        # 遍历所有的学生信息
        for stu in self.students.values():
            # 将学生转换成一个学生字符串对象
            # stu_s = str(stu)
            stu_s = stu.stu_id + ' ' + stu.stu_name + ' ' + stu.stu_age + '\n'
            # print(stu_s)

            # 将学生信息组织成一个固定格式的字符串,按行写入到文件中
            file_w.write(stu_s)

        # 关闭文件
        file_w.close()

    # 加载数据
    def __load_data(self):
        print('加载数据')
        # 打开文件,并要处理文件不存在的异常
        file_r = None
        try:
            file_r = open('data', 'r')
        except Exception as e:
            print(e, '文件不存在')
        else:
            # 读取文件内容,按行读取
            content = file_r.readlines()

            # 遍历每一行数据
            for stu_s in content:
                split_info = stu_s.split()

                # 创建一个学生对象,然后保存到字典里
                stu = Student(split_info[0], split_info[1], split_info[2])
                # 加到字典里
                self.students[stu.stu_id] = stu
        finally:
            if file_r != None:
                file_r.close()

标签:__,name,管理系统,python,self,学生,stu,day11,id
From: https://www.cnblogs.com/lehoso/p/17065740.html

相关文章

  • Day11练习题
    text文件内容fileiseitheratextorbytestringgivingthenameandthepathifthefileisn'tinthecurrentworkingdirectoryofthefiletobeopenedora......
  • 使用Python——查看自己电脑的ip和MAC地址
    使用Python——查看自己电脑的ip和MAC地址importsocketimportuuidip=socket.gethostbyname(socket.gethostname())node=uuid.getnode()macHex=uuid.UUID(in......
  • Python实现网络通信——TCP编程
    TCP编程  服务器端代码'''connect(address)链接远程计算机send(bytes[,flags])发送数据recv(bufsize[,flags])发送数据bind(address)绑定地址liste......
  • 记录一次python爬虫模拟登录吧
    测试网站是本人学校,费话不多说下面开始首先直接导库,过程中需要时间戳,rsa加密importrequestsimportreimporttimefromCrypto.PublicKeyimportRSAfromCrypto.Ci......
  • archlinux将python更换到3.11
    python更换到3.11版本安装python3.11首先利用yay-Spython311生成缓存文件,在~/.cache/yay/python311接着去官网下载一个python3.11的包,https://aur.archlinux.org/pack......
  • Python面向对象(上)
    Python面向对象(上)python是一门面向对象的编程语言。何为对象?对象是类的实例。在生活中,任何一个事物都是一个对象,如牡丹花。牡丹花的类是花类,同样属于花类的还有荷花、月季......
  • SICP:复数的直角和极坐标的表示(Python实现)
    绪论我们已经介绍过数据抽象,这是一种构造系统的方法学,它能够使程序中的大部分描述与其所操作的数据对象的具体表示无关,比如一个有理数程序的设计与有理数的实现相分离。这......
  • Python - XSS-Attribute
    参考资料:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-attribute-xss-attribute/kbid-3-cross-site-scripting-attribute靶场环境$sudodockerp......
  • 【Python】输入 LaTeX 代码并通过 Sympy 完成计算或化简
    Sympy是常用的一个符号计算的Python库,基本可以满足初等数学到高等数学、线性代数、离散数学以及本科物理所需的符号计算。然而Sympy在使用时还需要声明变量,并使用类W......
  • Python XSS
    参考资料:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-xss/kbid-3-cross-site-scripting靶场环境搭建$sudodockerpullblabla1337/owasp-skf-l......