day19 课程(面向对象开发学员管理系统 & dict方法)

课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=351

19.1 章节介绍

1.了解面向对象开发过程中类内部功能的分析方法

2.了解常用系统功能

  (1)添加

  (2)删除

  (3)修改

  (4)查询

19.2 介绍系统需求

使用面向对象编程思想完成学员管理系统的开发,具体如下:

(1)系统要求:学员数据存储在文件中

(2)系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能

19.3 准备程序文件

19.3.1 分析

角色分析:

  (1)学员角色登录

  (2)管理系统

工作中注意事项:

  (1)为了方便维护代码,一般一个角色一个程序文件

  (2)项目要有主程序入口,习惯为 main.py

基于以上,需要 3 个文件:即 学员角色、管理角色、主程序

19.3.2 创建程序文件

1.先创建项目目录,例如:StudentManagerSystem

2.再创建程序文件如下:

  (1)程序入口文件:main.py

  (2)学员文件:student.py

  (3)管理系统文件:managerSystem.py

19.4 定义学员类

需求:

  (1)学员信息包含:姓名、性别、手机号

  (2)添加 __str__ 魔法方法,方便查看学员对象信息

# student.py 文件

# 定义学员类 传参:姓名、性别、手机号
class Student(object):
    def __init__(self, name, gender, phone):
        self.name = name
        self.gender = gender
        self.phone = phone

    def __str__(self):
        return f"{self.name} {self.gender} {self.phone}"

# 测试使用
if __name__ == '__main__':
    test = Student('张三', '', '123456')
    print(test)

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\student.py 
张三 男 123456

Process finished with exit code 0

19.5 了解管理系统的需求

需求:

  1.存储数据的位置:文件(student.data)

    (1)加载文件数据

    (2)修改数据后保存到文件

  2.存储数据的形式:列表存储学员对象,列表中存储字典

  3.系统功能:

    (1)添加学员

    (2)删除学员

    (3)修改学员

    (4)查询学员信息

    (5)显示所有学员信息

    (6)保存学员信息

19.6 定义管理系统类

# managerSystem.py 文件

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

19.7 管理系统框架需求和步骤

需求:系统功能循环使用,用户输入不同的功能序号执行不同的功能

步骤:

  1.定义程序入口函数

    (1)加载数据

    (2)显示功能菜单

    (3)用户输入功能序号

    (4)根据用户输入的功能序号执行不同的功能

  2.定义系统功能函数,添加、删除学员等

19.8 管理系统框架之程序入口函数

# managerSystem.py 文件

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        while True:
            # 1.2 显示功能菜单
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                pass
            elif menu_num == 2:  # 删除学员
                pass
            elif menu_num == 3:  # 修改学员信息
                pass
            elif menu_num == 4:  # 查询学员信息
                pass
            elif menu_num == 5:  # 显示所有学员信息
                pass
            elif menu_num == 6:  # 保存学员信息
                pass
            elif menu_num == 7:  # 退出系统
                break

19.9 管理系统框架之定义系统功能函数

# managerSystem.py 文件

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        self.load_student()
        while True:
            # 1.2 显示功能菜单
            self.show_menu()
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                self.add_student()
            elif menu_num == 2:  # 删除学员
                self.del_student()
            elif menu_num == 3:  # 修改学员信息
                self.modify_student()
            elif menu_num == 4:  # 查询学员信息
                self.search_student()
            elif menu_num == 5:  # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:  # 保存学员信息
                self.save_student()
            elif menu_num == 7:  # 退出系统
                break

    # 2.1 显示功能菜单  打印序号的功能对应关系 -- 静态方法
    @staticmethod
    def show_menu():
        print("请选择如下功能: ")
        print("1.添加学员")
        print("2.删除学员")
        print("3.修改学员信息")
        print("4.查询学员信息")
        print("5.显示所有学员信息")
        print("6.保存学员信息")
        print("7.退出系统")
    # 2.2 添加学员
    def add_student(self):
        print("添加学员")
    # 2.3 删除学员
    def del_student(self):
        print("删除学员")
    # 2.4 修改学员信息
    def modify_student(self):
        print("修改学员信息")
    # 2.5 查询学员信息
    def search_student(self, name):
        print("查询学员信息")
    # 2.6 显示所有学员信息
    def show_student(self):
        print("显示所有学员信息")
    # 2.7 保存学员信息
    def save_student(self):
        print("保存学员信息")
    # 2.8 加载学员信息
    def load_student(self):
        print("加载学员信息")

19.10 程序入口文件功能实现

# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 6
保存学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.11 添加学员功能

需求:用户输入学员姓名、性别、手机号,将学员添加到系统

步骤:

  1.用户输入姓名、性别、手机号

  2.创建该学员对象

  3.将该学员对象添加到列表

# managerSystem.py 文件
from student import *  # 3.2 导入学员模块 基于类创建对象

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        self.load_student()
        while True:
            # 1.2 显示功能菜单
            self.show_menu()
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                self.add_student()
            elif menu_num == 2:  # 删除学员
                self.del_student()
            elif menu_num == 3:  # 修改学员信息
                self.modify_student()
            elif menu_num == 4:  # 查询学员信息
                self.search_student()
            elif menu_num == 5:  # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:  # 保存学员信息
                self.save_student()
            elif menu_num == 7:  # 退出系统
                break

    # 2.1 显示功能菜单  打印序号的功能对应关系 -- 静态方法
    @staticmethod
    def show_menu():
        print("请选择如下功能: ")
        print("1.添加学员")
        print("2.删除学员")
        print("3.修改学员信息")
        print("4.查询学员信息")
        print("5.显示所有学员信息")
        print("6.保存学员信息")
        print("7.退出系统")
    # 2.2 添加学员
    def add_student(self):
        # 3.1 用户输入姓名、性别、手机号
        name = input("请输入您的姓名: ")
        gender = input("请输入您的性别: ")
        tel = input("请输入您的手机号: ")
        # 3.2 创建学员对象
        student = Student(name, gender, tel)  # 基于类创建对象传入实参
        # 3.3 将该对象添加到学员列表
        self.student_list.append(student)
        print(self.student_list)  # 打印仅测试时使用
        print(student)

    # 2.3 删除学员
    def del_student(self):
        print("删除学员")
    # 2.4 修改学员信息
    def modify_student(self):
        print("修改学员信息")
    # 2.5 查询学员信息
    def search_student(self):
        print("查询学员信息")
    # 2.6 显示所有学员信息
    def show_student(self):
        print("显示所有学员信息")
    # 2.7 保存学员信息
    def save_student(self):
        print("保存学员信息")
    # 2.8 加载学员信息
    def load_student(self):
        print("加载学员信息")
# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: zhangsan
请输入您的性别: 男
请输入您的手机号: 111
[<student.Student object at 0x000001EF9000E278>]
zhangsan 男 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.12 删除学员功能

需求:用户输入目标学员姓名,如果学员存在

步骤:

  1.用户输入目标学员姓名

  2.遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则则提示该学员不存在

# managerSystem.py 文件
from student import *  # 3.2 导入学员模块 基于类创建对象

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        self.load_student()
        while True:
            # 1.2 显示功能菜单
            self.show_menu()
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                self.add_student()
            elif menu_num == 2:  # 删除学员
                self.del_student()
            elif menu_num == 3:  # 修改学员信息
                self.modify_student()
            elif menu_num == 4:  # 查询学员信息
                self.search_student()
            elif menu_num == 5:  # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:  # 保存学员信息
                self.save_student()
            elif menu_num == 7:  # 退出系统
                break

    # 2.1 显示功能菜单  打印序号的功能对应关系 -- 静态方法
    @staticmethod
    def show_menu():
        print("请选择如下功能: ")
        print("1.添加学员")
        print("2.删除学员")
        print("3.修改学员信息")
        print("4.查询学员信息")
        print("5.显示所有学员信息")
        print("6.保存学员信息")
        print("7.退出系统")
    # 2.2 添加学员
    def add_student(self):
        # 3.1 用户输入姓名、性别、手机号
        name = input("请输入您的姓名: ")
        gender = input("请输入您的性别: ")
        tel = input("请输入您的手机号: ")
        # 3.2 创建学员对象
        student = Student(name, gender, tel)  # 基于类创建对象传入实参
        # 3.3 将该对象添加到学员列表
        self.student_list.append(student)
        print(self.student_list)  # 打印仅测试时使用
        print(student)

    # 2.3 删除学员
    def del_student(self):
        # 4.1 用户输入目标学员姓名
        del_name = input("请输入您要删除学员的姓名: ")
        # 4.2 遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == del_name:
                self.student_list.remove(student)
                break  # 删除后面不在执行查找, 打破循环
        else:  # 查不到执行
            print("查无此人")
        print(self.student_list)  # 打印仅测试时使用

    # 2.4 修改学员信息
    def modify_student(self):
        print("修改学员信息")
    # 2.5 查询学员信息
    def search_student(self):
        print("查询学员信息")
    # 2.6 显示所有学员信息
    def show_student(self):
        print("显示所有学员信息")
    # 2.7 保存学员信息
    def save_student(self):
        print("保存学员信息")
    # 2.8 加载学员信息
    def load_student(self):
        print("加载学员信息")
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: zhangsan
请输入您的性别: 男
请输入您的手机号: 111
[<student.Student object at 0x000001C1CAB2E198>]
zhangsan 男 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 2
请输入您要删除学员的姓名: lisi
查无此人
[<student.Student object at 0x000001C1CAB2E198>]
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 2
请输入您要删除学员的姓名: zhangsan
[]
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.13 修改学员功能

需求:用户输入目标学员姓名,如果学员存在则修改该学员信息

步骤:

  1.用户输入目标学员姓名

  2.遍历学员数据列表,如果用户输入的学员姓名存在则修改学员的姓名、性别、手机号数据,否则则提示该学员不存在

# managerSystem.py 文件
from student import *  # 3.2 导入学员模块 基于类创建对象

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        self.load_student()
        while True:
            # 1.2 显示功能菜单
            self.show_menu()
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                self.add_student()
            elif menu_num == 2:  # 删除学员
                self.del_student()
            elif menu_num == 3:  # 修改学员信息
                self.modify_student()
            elif menu_num == 4:  # 查询学员信息
                self.search_student()
            elif menu_num == 5:  # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:  # 保存学员信息
                self.save_student()
            elif menu_num == 7:  # 退出系统
                break

    # 2.1 显示功能菜单  打印序号的功能对应关系 -- 静态方法
    @staticmethod
    def show_menu():
        print("请选择如下功能: ")
        print("1.添加学员")
        print("2.删除学员")
        print("3.修改学员信息")
        print("4.查询学员信息")
        print("5.显示所有学员信息")
        print("6.保存学员信息")
        print("7.退出系统")
    # 2.2 添加学员
    def add_student(self):
        # 3.1 用户输入姓名、性别、手机号
        name = input("请输入您的姓名: ")
        gender = input("请输入您的性别: ")
        tel = input("请输入您的手机号: ")
        # 3.2 创建学员对象
        student = Student(name, gender, tel)  # 基于类创建对象传入实参
        # 3.3 将该对象添加到学员列表
        self.student_list.append(student)
        print(self.student_list)  # 打印仅测试时使用
        print(student)

    # 2.3 删除学员
    def del_student(self):
        # 4.1 用户输入目标学员姓名
        del_name = input("请输入您要删除学员的姓名: ")
        # 4.2 遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == del_name:
                self.student_list.remove(student)
                break  # 删除后面不在执行查找, 打破循环
        else:  # 查不到执行
            print("查无此人")
        print(self.student_list)  # 打印仅测试时使用

    # 2.4 修改学员信息
    def modify_student(self):
        # 5.1 用户输入目标学员姓名
        modify_name = input("请输入您要修改学员的姓名: ")
        # 5.2 遍历学员数据列表,如果用户输入的学员姓名存在则修改学员的姓名、性别、手机号数据,否则则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == modify_name:  # 查到修改学员姓名
                student.name = input("请输入您要修改学员的姓名: ")
                student.gender = input("请输入您要修改学员的性别: ")
                student.tel = input("请输入您要修改学员的手机号: ")
                print(f"修改学员信息成功, 姓名: {student.name}, 性别: {student.gender},手机号: {student.tel}")
                break  # 修改后面不在执行查找, 打破循环
        else:  # 查不到执行
            print("查无此人")
        print(self.student_list)  # 打印仅测试时使用

    # 2.5 查询学员信息
    def search_student(self):
        print("查询学员信息")
    # 2.6 显示所有学员信息
    def show_student(self):
        print("显示所有学员信息")
    # 2.7 保存学员信息
    def save_student(self):
        print("保存学员信息")
    # 2.8 加载学员信息
    def load_student(self):
        print("加载学员信息")
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: zhangsan
请输入您的性别: nan
请输入您的手机号: 111
[<student.Student object at 0x000002331280E278>]
zhangsan nan 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 3
请输入您要修改学员的姓名: lisi
查无此人
[<student.Student object at 0x000002331280E278>]
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 3
请输入您要修改学员的姓名: zhangsan
请输入您要修改学员的姓名: 张三
请输入您要修改学员的性别: 男
请输入您要修改学员的手机号: 110
修改学员信息成功, 姓名: 张三, 性别: 男,手机号: 110
[<student.Student object at 0x000002331280E278>]
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.14 查询学员信息

需求:用户输入目标学员姓名,如果学员存在则打印该学员信息

步骤:

  1.用户输入目标学员姓名

  2.遍历学员数据列表,如果用户输入的学员姓名存在则打印学员信息,否则提示该学员不存在

........
    # 2.5 查询学员信息
    def search_student(self):
        # 6.1 用户输入目标学员姓名
        search_name = input("请输入您要查询学员的姓名: ")
        # 6.2 遍历学员数据列表,如果用户输入的学员姓名存在则打印学员信息,否则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == search_name:  # student 中存放的是基于 student.py 文件中 Student 创建的信息 phone 是索引
                print(f"学员信息 姓名: {student.name}, 性别: {student.gender},手机号: {student.phone}")  # 这里的 phone 与student.py 中 phone 定义一样
                break
        else:
            print("查无此人")
.......
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: zhangsan
请输入您的性别: nan
请输入您的手机号: 111
[<student.Student object at 0x000001C0B470E390>]
zhangsan nan 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 4
请输入您要查询学员的姓名: lisi
查无此人
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 4
请输入您要查询学员的姓名: zhangsan
学员信息 姓名: zhangsan, 性别: nan,手机号: 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.15 显示所有学员信息

需求:打印所有学员信息

步骤:遍历学员数据列表,打印所有学员信息

.......
    # 2.6 显示所有学员信息
    def show_student(self):
        # 7.1 遍历学员数据列表,打印所有学员信息
        print("姓名\t性别\t手机号")
        for student in self.student_list:
            print(f"{student.name}\t{student.gender}\t{student.phone}")  # 这里的 phone 与student.py 中 phone 定义一样
        print("-----上述输出完毕-----")
.......
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: zhangsan
请输入您的性别: nan
请输入您的手机号: 111
[<student.Student object at 0x0000022D5EADE208>]
zhangsan nan 111
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: lisi
请输入您的性别: nv
请输入您的手机号: 112
[<student.Student object at 0x0000022D5EADE208>, <student.Student object at 0x0000022D5EADE400>]
lisi nv 112
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 5
姓名    性别    手机号
zhangsan    nan    111
lisi    nv    112
-----上述输出完毕-----
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.16 保存学员信息需求和注意事项

需求:将修改后的学员数据保存到存储数据的文件

步骤:

  1.打开文件

  2.写入数据

  3.关闭文件

思考:

  1.文件写入的数据是学员对象的内存地址吗?"学员数据存储在列表,列表中存储的是学员对象,存储内存地址的编号是没有意义的,所以要用列表中是字典写入数据"

  2.文件内数据要求的数据类型是什么? "字符串,转为字符串写入"

19.17 扩展 __dict__

收集类对象或实例对象的属性和方法以及对应的值,从而返回一个字典

# 1 定义类
class A():
    a = 0  # 类属性
    def __init__(self):  # 初始化方法, 即魔法方法
        self.b = 1  # 实例属性
# 2 基于类创建对象
aa = A()

# 3 调用 __dict__
print(A.__dict__)  # 返回 类内部所有属性和方法对应的字典
print(aa.__dict__)  # 返回 实例属性和值组成的字典

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\01.__dict__.py 
{'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x0000015954D1D840>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'b': 1}

Process finished with exit code 0

19.18 保存学员信息

........
    # 2.7 保存学员信息
    def save_student(self):
        # 8.1 打开文件, 不存在则创建文件
        f = open("student.txt", "w")
        # 8.2 文件写入学员数据
        # 8.2.1 注意:文件写入的数据不能是学员的内存地址(列表内是对象), 需要把学员数据转换成列表字典数据再做存储
        new_list = [ i.__dict__ for i in self.student_list]  # for 循环推导式, 将列表中每个对象字典化 即 name='张三', gender='男', phone='123456' 字典化
        print(new_list)
        # 8.2.2 注意:文件内数据要求为字符串类型, 故需要先转换数据类型为字符串才能文件写入数据
        f.write(str(new_list))  # 转换
        # 8.3 关闭文件
        f.close()
........
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
加载学员信息
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 1
请输入您的姓名: lisi
请输入您的性别: nv
请输入您的手机号: 112
[<student.Student object at 0x0000022EEB2DF358>]
lisi nv 112
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 6
[{'name': 'lisi', 'gender': 'nv', 'phone': '112'}]
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0
# student.txt 文件
[{'name': 'lisi', 'gender': 'nv', 'phone': '112'}] 

19.19 加载学员信息思路

需求:每次进入系统后,修改的数据是文件里面的数据

步骤:

  1.尝试以"r" 模式打开学员数据文件,如果文件不存在则以"w" 模式打开文件

  2.如果文件存在则读取数据并存储数据

    (1)读取数据

    (2)转换数据类型为列表并转换列表内的字典为对象

    (3)存储学员数据到学员列表

  3.关闭文件

19.20 加载学员信息

........
        # 2.8 加载学员信息
    def load_student(self):
        # 9.1 尝试以"r" 模式打开学员数据文件,如果文件不存在则以"w" 模式打开文件
        try:
            f = open("student.txt", "r")  # 文件存在 只读模式
        except:
            f = open("student.txt", "w")  # 文件不存在 写模式打开
        # 9.2 如果文件存在则读取数据并存储数据
        else:  # 没有异常执行
            data = f.read()  # 9.2.1 读取数据 data 是字符串
            # 9.2.2 转换数据类型为列表并转换列表内的字典为对象
            new_list = eval(data)  # 转换成列表原本类型
            # 9.2.3 存储学员数据到学员列表
            self.student_list = [Student(i['name'], i['gender'], i['phone']) for i in new_list]  # for 推导式循环列表中字典,对列表中数据基于 Student 类重新创建对象 存储到列表中
        finally:
            f.close()  # 9.3 关闭文件
........
# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法

------------------------------------------------ 第一次执行后
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 4
请输入您要查询学员的姓名: lisi
学员信息 姓名: lisi, 性别: nv,手机号: 112
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 5
姓名    性别    手机号
lisi    nv    112
-----上述输出完毕-----
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0
------------------------------------------------ 第二次执行后(删除student.txt文件)
C:\Users\马俊南\AppData\Local\Programs\Python\Python37\python.exe D:\Pycharm\code\day19\StudentManagerSystem\main.py 
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 4
请输入您要查询学员的姓名: lisi
查无此人
请选择如下功能: 
1.添加学员
2.删除学员
3.修改学员信息
4.查询学员信息
5.显示所有学员信息
6.保存学员信息
7.退出系统
请输入您要选择的功能序号: 7

Process finished with exit code 0

19.21 全体代码

# main.py 文件

# 1 导入 managerSystem 模块
from managerSystem import *  # managerSystem模块名

# 2 启动学员管理系统
if __name__ == '__main__':  # 当前文件运行时
    manager = StudentManager()  # 基于管理类创建对象 managerSystem类名
    manager.run()  # 调用管理运行的方法
# student.py 文件

# 定义学员类 传参:姓名、性别、手机号
class Student(object):
    def __init__(self, name, gender, phone):
        self.name = name
        self.gender = gender
        self.phone = phone

    def __str__(self):
        return f"{self.name} {self.gender} {self.phone}"

# 测试使用
if __name__ == '__main__':
    test = Student('张三', '', '123456')
    print(test)
# managerSystem.py 文件
from student import *  # 3.2 导入学员模块 基于类创建对象

class StudentManager(object):
    def __init__(self):
        self.student_list = []  # 存储学员数据信息所用的列表

    def run(self):  # 1 程序入口函数
        # 1.1 加载文件里面的学员数据
        self.load_student()
        while True:
            # 1.2 显示功能菜单
            self.show_menu()
            # 1.3 用户输入目标功能序号
            menu_num = int(input("请输入您要选择的功能序号: "))  # int 转换整型类型
            # 1.4 根据用户输入的序号执行不同的功能
            if menu_num == 1:  # 添加学员
                self.add_student()
            elif menu_num == 2:  # 删除学员
                self.del_student()
            elif menu_num == 3:  # 修改学员信息
                self.modify_student()
            elif menu_num == 4:  # 查询学员信息
                self.search_student()
            elif menu_num == 5:  # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:  # 保存学员信息
                self.save_student()
            elif menu_num == 7:  # 退出系统
                break

    # 2.1 显示功能菜单  打印序号的功能对应关系 -- 静态方法
    @staticmethod
    def show_menu():
        print("请选择如下功能: ")
        print("1.添加学员")
        print("2.删除学员")
        print("3.修改学员信息")
        print("4.查询学员信息")
        print("5.显示所有学员信息")
        print("6.保存学员信息")
        print("7.退出系统")
    # 2.2 添加学员
    def add_student(self):
        # 3.1 用户输入姓名、性别、手机号
        name = input("请输入您的姓名: ")
        gender = input("请输入您的性别: ")
        tel = input("请输入您的手机号: ")
        # 3.2 创建学员对象
        student = Student(name, gender, tel)  # 基于类创建对象传入实参
        # 3.3 将该对象添加到学员列表
        self.student_list.append(student)
        print(self.student_list)  # 打印仅测试时使用
        print(student)

    # 2.3 删除学员
    def del_student(self):
        # 4.1 用户输入目标学员姓名
        del_name = input("请输入您要删除学员的姓名: ")
        # 4.2 遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == del_name:
                self.student_list.remove(student)
                break  # 删除后面不在执行查找, 打破循环
        else:  # 查不到执行
            print("查无此人")
        print(self.student_list)  # 打印仅测试时使用

    # 2.4 修改学员信息
    def modify_student(self):
        # 5.1 用户输入目标学员姓名
        modify_name = input("请输入您要修改学员的姓名: ")
        # 5.2 遍历学员数据列表,如果用户输入的学员姓名存在则修改学员的姓名、性别、手机号数据,否则则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == modify_name:  # 查到修改学员姓名
                student.name = input("请输入您要修改学员的姓名: ")
                student.gender = input("请输入您要修改学员的性别: ")
                student.tel = input("请输入您要修改学员的手机号: ")
                print(f"修改学员信息成功, 姓名: {student.name}, 性别: {student.gender}, 手机号: {student.tel}")
                break  # 修改后面不在执行查找, 打破循环
        else:  # 查不到执行
            print("查无此人")
        print(self.student_list)  # 打印仅测试时使用

    # 2.5 查询学员信息
    def search_student(self):
        # 6.1 用户输入目标学员姓名
        search_name = input("请输入您要查询学员的姓名: ")
        # 6.2 遍历学员数据列表,如果用户输入的学员姓名存在则打印学员信息,否则提示该学员不存在
        for student in self.student_list:  # 遍历列表查询学员
            if student.name == search_name:  # student 中存放的是基于 student.py 文件中 Student 创建的信息 phone 是索引
                print(f"学员信息 姓名: {student.name}, 性别: {student.gender},手机号: {student.phone}")  # 这里的 phone 与student.py 中 phone 定义一样
                break
        else:
            print("查无此人")

    # 2.6 显示所有学员信息
    def show_student(self):
        # 7.1 遍历学员数据列表,打印所有学员信息
        print("姓名\t性别\t手机号")
        for student in self.student_list:
            print(f"{student.name}\t{student.gender}\t{student.phone}")  # 这里的 phone 与student.py 中 phone 定义一样
        print("-----上述输出完毕-----")

    # 2.7 保存学员信息
    def save_student(self):
        # 8.1 打开文件, 不存在则创建文件
        f = open("student.txt", "w")
        # 8.2 文件写入学员数据
        # 8.2.1 注意:文件写入的数据不能是学员的内存地址(列表内是对象), 需要把学员数据转换成列表字典数据再做存储
        new_list = [ i.__dict__ for i in self.student_list]  # for 循环推导式, 将列表中每个对象字典化 即 name='张三', gender='男', phone='123456'
        print(new_list)
        # 8.2.2 注意:文件内数据要求为字符串类型, 故需要先转换数据类型为字符串才能文件写入数据
        f.write(str(new_list))  # 转换
        # 8.3 关闭文件
        f.close()

        # 2.8 加载学员信息
    def load_student(self):
        # 9.1 尝试以"r" 模式打开学员数据文件,如果文件不存在则以"w" 模式打开文件
        try:
            f = open("student.txt", "r")  # 文件存在 只读模式
        except:
            f = open("student.txt", "w")  # 文件不存在 写模式打开
        # 9.2 如果文件存在则读取数据并存储数据
        else:  # 没有异常执行
            data = f.read()  # 9.2.1 读取数据 data 是字符串
            # 9.2.2 转换数据类型为列表并转换列表内的字典为对象
            new_list = eval(data)  # 转换成列表原本类型
            # 9.2.3 存储学员数据到学员列表
            self.student_list = [Student(i['name'], i['gender'], i['phone']) for i in new_list]  # for 推导式循环列表中字典,对列表中数据基于 Student 类重新创建对象 存储到列表中
        finally:
            f.close()  # 9.3 关闭文件

19.22 学员管理系统涵盖知识点总结

1.函数

  (1)定义和调用

  (2)参数的使用

2.面向对象

  (1)定义类

  (2)创建对象

  (3)定义和调用实例属性

  (4)定义和调用实例方法

3.数据类型

  (1)列表

    a.增加删除数据

    b.列表推导式

  (2)字典

  (3)字符串

4.文件操作

  (1)打开文件

  (2)读取或写入(读取和写入必须是字符串类型)

  (3)关闭文件

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-10-09 16:38  马俊南  阅读(7)  评论(0)    收藏  举报