Bootstrap

【Python】—— 学员管理系统

目录

(一)系统需求

(二) 准备程序文件

2.1 分析

2.2 创建程序文件 

(三)书写程序

3.1 student.py

3.2 managerSystem.py

 3.2.1 定义类 

3.2.2 管理系统框架

3.3 main.py

3.4 定义系统功能函数

3.4.1 添加功能

3.4.2 删除学员

3.4.3 修改学员信息

3.4.4 查询学员信息

3.4.5 显示所有学员信息

3.4.6 保存学员信息

3.4.7 加载学员信息


(一)系统需求

使⽤⾯向对象编程思想完成学员管理系统的开发,具体如下:
  • 系统要求:学员数据存储在⽂件中
  • 系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。

(二) 准备程序文件

2.1 分析

⻆⾊分析
  • 学员
  • 管理系统
⼯作中注意事项
  • 1. 为了⽅便维护代码,⼀般⼀个⻆⾊⼀个程序⽂件;
  • 2. 项⽬要有主程序⼊⼝,习惯为 main.py 

2.2 创建程序文件 

创建项⽬⽬录,例如: StudentManagerSystem
程序文件如下:
  • 程序入⼝⽂件:main.py
  • 学员文件:student.py
  • 管理系统文件:managerSystem.py

(三)书写程序

3.1 student.py

需求:
  • 学员信息包含:姓名、性别、⼿机号;
  • 添加 __str__ 魔法⽅法,⽅便查看学员对象信息
class Student(object):
    def __init__(self, name, gender, tel):
        self.name = name
        self.gender = gender
        self.tel = tel

    def __str__(self):
        return f'{self.name}, {self.gender}, {self.tel}'

3.2 managerSystem.py

需求:
存储数据的位置:⽂件 (student.data)
  • 加载⽂件数据
  • 修改数据后保存到⽂件
存储数据的形式:列表存储学员对象
系统功能
  • 添加学员
  • 删除学员
  • 修改学员
  • 查询学员信息
  • 显示所有学员信息
  • 保存学员信息
  • 退出系统

 3.2.1 定义类 

class StudentManager(object):
    def __init__(self):
        # 存储数据所⽤的列表
        self.student_list = []

3.2.2 管理系统框架

需求:系统功能循环使⽤,⽤户输⼊不同的功能序号执⾏不同的功能。
步骤
定义程序⼊⼝函数
  • 加载数据
  • 显示功能菜单
  • ⽤户输⼊功能序号
  • 根据⽤户输⼊的功能序号执⾏不同的功能
定义系统功能函数,添加、删除学员等


3.3 main.py

# 1. 导⼊managerSystem模块
from managerSystem import *

# 2. 启动学员管理系统
if __name__ == '__main__':
    student_manager = StudentManager()
    student_manager.run()

3.4 定义系统功能函数

3.4.1 添加功能

需求:⽤户输⼊学员姓名、性别、⼿机号,将学员添加到系统。
步骤
  • ⽤户输⼊姓名、性别、⼿机号
  • 创建该学员对象
  • 将该学员对象添加到列表
代码
# 添加学员函数内部需要创建学员对象,故先导⼊student模块
from student import *

class StudentManager(object):
......
 
    #  添加学员
    def add_student(self):
        # 1. ⽤户输⼊姓名、性别、⼿机号
        name = input('请输⼊您的姓名:')
        gender = input('请输⼊您的性别:')
        tel = input('请输⼊您的⼿机号:')

        # 2. 创建学员对象:先导⼊学员模块,再创建对象
        student = Student(name, gender, tel)

        # 3. 将该学员对象添加到列表
        self.student_list.append(student)
 
        # 打印信息
        print(self.student_list)
        print(student)

3.4.2 删除学员

需求:⽤户输⼊⽬标学员姓名,如果学员存在则删除该学员。
步骤
  • ⽤户输⼊⽬标学员姓名
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则删除,否则则提示该学员不存在。
代码
# 删除学员:删除指定姓名的学员
def del_student(self):
    # 1. ⽤户输⼊⽬标学员姓名
    del_name = input('请输⼊要删除的学员姓名:')
 
    # 2. 如果⽤户输⼊的⽬标学员存在则删除,否则提示学员不存在
    for i in self.student_list:
        if i.name == del_name:
            self.student_list.remove(i)
            break
        else:
            print('查⽆此⼈!')

        # 打印学员列表,验证删除功能
        print(self.student_list)

3.4.3 修改学员信息

需求:⽤户输⼊⽬标学员姓名,如果学员存在则修改该学员信息。
步骤
  • ⽤户输⼊⽬标学员姓名;
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则修改学员的姓名、性别、⼿机号数据, 否则则提示该学员不存在。
代码
# 修改学员信息
def modify_student(self):
    # 1. ⽤户输⼊⽬标学员姓名
    modify_name = input('请输⼊要修改的学员的姓名:')

    # 2. 如果⽤户输⼊的⽬标学员存在则修改姓名、性别、⼿机号等数据,否则提示学员不存在
    for i in self.student_list:
        if i.name == modify_name:
            i.name = input('请输⼊学员姓名:')
            i.gender = input('请输⼊学员性别:')
            i.tel = input('请输⼊学员⼿机号:')
            print(f'修改该学员信息成功,姓名{i.name},性别{i.gender}, ⼿机号{i.tel}')
            break
        else:
            print('查⽆此⼈!')

3.4.4 查询学员信息

需求:⽤户输⼊⽬标学员姓名,如果学员存在则打印该学员信息

步骤

  • ⽤户输⼊⽬标学员姓名
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则打印学员信息,否则提示该学员不存在。
代码
# 查询学员信息
def search_student(self):
    # 1. ⽤户输⼊⽬标学员姓名
    search_name = input('请输⼊要查询的学员的姓名:')
    # 2. 如果⽤户输⼊的⽬标学员存在,则打印学员信息,否则提示学员不存在
    for i in self.student_list:
        if i.name == search_name:
            print(f'姓名{i.name},性别{i.gender}, ⼿机号{i.tel}')
            break
        else:
            print('查⽆此⼈!')

3.4.5 显示所有学员信息

打印所有学员信息
步骤
  • 遍历学员数据列表,打印所有学员信息
代码
# 显示所有学员信息
def show_student(self):
    print('姓名\t性别\t⼿机号')
    for i in self.student_list:
        print(f'{i.name}\t{i.gender}\t{i.tel}')

3.4.6 保存学员信息

需求:将修改后的学员数据保存到存储数据的⽂件。
步骤
  • 打开⽂件
  • ⽂件写⼊数据
  • 关闭⽂件
思考
  • 1. ⽂件写⼊的数据是学员对象的内存地址吗?
  • 2. ⽂件内数据要求的数据类型是什么?

拓展 __dict__ 

class A(object):
    a = 0
    def __init__(self):
        self.b = 1

aa = A()

# 返回类内部所有属性和⽅法对应的字典
print(A.__dict__)

# 返回实例属性和值组成的字典
print(aa.__dict__)

Python

# 保存学员信息
def save_student(self):
    # 1. 打开⽂件
    f = open('student.data', 'w')

    # 2. ⽂件写⼊学员数据
    # 注意1:⽂件写⼊的数据不能是学员对象的内存地址,
    # 需要把学员数据转换成列表字典数据再做存储
    new_list = [i.__dict__ for i in self.student_list]
    # [{'name': 'aa', 'gender': 'nv', 'tel': '111'}]
    print(new_list)

    # 注意2:⽂件内数据要求为字符串类型,故需要先转换数据类型为字符串才能⽂件写⼊数据
    f.write(str(new_list))

    # 3. 关闭⽂件
    f.close()

3.4.7 加载学员信息

需求:每次进⼊系统后,修改的数据是⽂件⾥⾯的数据
步骤
  • 尝试以 "r" 模式打开学员数据⽂件,如果⽂件不存在则以 "w" 模式打开⽂件
  • 如果⽂件存在则读取数据并存储数据
  • 读取数据
  • 转换数据类型为列表并转换列表内的字典为对象
  • 存储学员数据到学员列表
  • 关闭⽂件
代码
# 加载学员信息
def load_student(self):
    # 尝试以"r"模式打开数据⽂件,⽂件不存在则提示⽤户;⽂件存在(没有异常)则读取数据
    try:
        f = open('student.data', 'r')
    except:
        f = open('student.data', 'w')
    else:
        # 1. 读取数据
        data = f.read()
        # 2. ⽂件中读取的数据都是字符串且字符串内部为字典数据,故需要转换数据类型再
        # 转换字典为对象后存储到学员列表
         new_list = eval(data)
         self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
     finally:
         # 3. 关闭⽂件
         f.close()

;