Python OOP 项目实践:面向对象版学员管理系统(分析需求、定义学员类、定义管理系统类、__dict__

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:

  • 面向对象编程,要定义类,由类创建对象。类从何而来?分析需求,需求里有哪些事物哪些角色,然后把事物向上抽象成类,然后创建程序文件
  • 要创建程序文件,需要先创建一个项目目录Directory,在该目录下创建各个功能的文件,把变量、函数封装成类,把类和属性方法封装成模块,把经常用模块文件封装为包调用
  • 要创建一个独立的文件,需要先创建一个工程Project

在这里插入图片描述
在这里插入图片描述
点击路径,右键,new,Directory
在这里插入图片描述
点击项目目录StudentManagerSystem,右键,Python File,
在这里插入图片描述

三、书写程序

学员,学员管理系统,要先写哪个呢?

答:因为学员管理系统要对学员进行查改增删,所以要先写学员的代码student.py。要写学员,就要先写类,然后用类创建对象

  • 学员信息包含:姓名、性别、⼿机号;(定义实例属性)
  • 添加 str 魔法⽅法,⽅便查看学员对象信息

在这里插入图片描述

四、书写代码managerSystem.py

需求:

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

  • 加载⽂件数据
  • 修改数据后保存到⽂件

2、存储数据的形式:列表存储学员对象
3、系统功能

  • 添加学员
  • 删除学员
  • 修改学员
  • 查询学员信息
  • 显示所有学员信息
  • 保存学员信息

要对数据进行操作,首先要把数据从文件读入程序,在程序中把数据保存到变量,通过对变量的各种增删改查实现操作学员,保存数据把数据写入文件,退出系统。

要写管理系统代码,可以先定义一个管理系统类,把要实现的各种功能都封装在这个类中,然后用这个类创建对象
在这里插入图片描述

五、管理系统框架

需求:系统功能循环使⽤,⽤户输⼊不同的功能序号执⾏不同的功能。

步骤
1、定义程序⼊⼝函数

  • 加载数据
  • 显示功能菜单
  • ⽤户输⼊功能序号
  • 根据⽤户输⼊的功能序号执⾏不同的功能

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

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

    # 一、程序入口函数,启动程序后执行的函数
    def run(self):
        # 1.加载文件里面的学员数据
        while True:  # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
            # 2.显示功能界面
            # 3.用户输入功能序号
            menu_num = eval(input("请输入需要的功能序号:"))
            # 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

# 二、定义系统功能函数
# 2.1 显示功能菜单函数
# 2.2 添加学员函数
# 2.3 删除学员函数
# 2.4 修改学员信息函数
# 2.5 查询学员信息函数
# 2.6 显示所有学员信息函数
# 2.7 保存学员信息函数
# 2.8 加载学员信息

继续完善,

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

    # 一、程序入口函数,启动程序后执行的函数
    def run(self):
        # 1.加载文件里面的学员数据
        self.load_student()
        while True:  # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
            # 2.显示功能界面
            self.show_menu()  # 在类里面访问方法,self.方法名()
            # 3.用户输入功能序号
            menu_num = eval(input("请输入需要的功能序号:"))
            # 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):
        print("查询学员信息")
    # 2.6 显示所有学员信息函数
    def show_student(self):
        print("显示所有学员信息")
    # 2.7 保存学员信息函数
    def save_student(self):
        print("保存学员信息")
    # 2.8 加载学员信息
    def load_student(self):
        print("加载学员信息")

六、程序入口文件功能实现

入口文件,即运行这个文件就能启动系统。需要用管理系统类创建一个系统对象,然后这个系统对象调用run实例方法
在这里插入图片描述

# 1.导入管理系统模块
from managerSystem import *

# 2.启动管理系统
# 保证是当前文件运行才启动管理系统:if--创建对象并调用run实例方法
if __name__ == "__main__":
    student_manager = StudentManager()
    student_manager.run()

七、定义系统功能函数

1、添加功能

需求:⽤户输⼊学员姓名、性别、⼿机号,将学员添加到系统。

分析步骤,

  • ⽤户输⼊姓名、性别、⼿机号
  • 创建该学员对象
  • 将该学员对象添加到列表
  • 用户按保存,将列表元素写入文件
    # 2.2 添加学员函数
    def add_student(self):
        # 1.让用户输入姓名、性别、手机号
        name = input("请输入你的姓名:")
        gender = input("请输入你的性别:")
        tel = input("请输入你的手机号:")
        # 2.创建学员对象--类?类在student.py里,故要先导入student模块,再创建对象
        student = Student(name, gender, tel)
        # 3.将该对象添加到学员列表
        self.student_list.append(student)  # self.student_list的元素是类Student的对象
        # print(self.student_list)
        # print(student)

2、删除学员

需求:⽤户输⼊⽬标学员姓名,如果学员存在则删除该学员。

分析步骤

  • ⽤户输⼊⽬标学员姓名
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则删除,否则则提示该学员不存在。
    # 2.3 删除学员函数
    def del_student(self):
        # 1.用户输入目标学员姓名
        del_name = input("请输入要删除的学员姓名:")
        # 2.遍历学员列表,如果用户输入的姓名存在则删除学员,否则提示用户不存在
        for i in self.student_list:  # i是列表元素,即类Student的对象
            if del_name == i.name:  # self.student_list列表里的元素是类Student创建的,具有类Student的属性和方法
                self.student_list.remove(i)
                break
        else:
            print("没有该学员,查无此人")
        print(self.student_list)

3、修改学员信息

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

分析步骤

  • ⽤户输⼊⽬标学员姓名
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则修改学员的姓名、性别、⼿机号数据,否则则提示该学员不存在。
    # 2.4 修改学员信息函数
    def modify_student(self):
        # 1.用户输入目标学员姓名
        modify_name = input("请输入要修改的学员姓名:")
        # 2.遍历列表数据,如果学员存在,修改学员信息;如果不存在,提示学员不存在
        for i in self.student_list:
            if modify_name == i.name:
                i.name = input("姓名:")
                i.gender = input("性别:")
                i.tel = input("手机号:")
                print("修改成功,姓名{},性别{},手机号{}".format(i.name, i.gender, i.tel))
                break
        else:
            print("查无此人")

4、查询学员信息

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

分析步骤

  • ⽤户输⼊⽬标学员姓名
  • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则打印学员信息,否则提示该学员不存
    # 2.5 查询学员信息函数
    def search_student(self):
        # 1.用户输入要查询的学员
        search_name = input("请输入要查询的学员姓名:")
        # 2.遍历列表,如果学员存在就打印学员信息,否则提示不存在
        for i in self.student_list:
            if search_name == i.name:
                print("姓名是:{},性别是:{},手机号是:{}".format(i.name, i.gender, i.tel))
                break
        else:
            print("查无此人")

5、显示所有学员信息

需求:打印所有学员信息

分析步骤

  • 遍历学员数据列表,打印所有学员信息
    # 2.6 显示所有学员信息函数
    def show_student(self):
        # 1.打印表头
        print("姓名\t性别\t手机号")
        # 2.打印学员信息
        for i in self.student_list:
            print("{}\t{}\t{}".format(i.name, i.gender, i.tel))

6、保存学员信息

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

分析步骤

  • 打开⽂件
  • ⽂件写⼊数据
  • 关闭⽂件

思考

  1. ⽂件写⼊的数据是学员对象的内存地址吗?(是对象的属性值)
  2. ⽂件内数据要求的数据类型是什么?(是字符串)

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

class A:
    a = 0  # a是类属性

    def __init__(self):
        self.b = 1  # b是实例属性

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

输出:
{
    
    '__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x0000015A2DB9D3A8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{
    
    'b': 1}
    # 2.7 保存学员信息函数
    def save_student(self):
        # 1.打开文件
        f = open("student.data", "w")
        # 2.文件写入数据
        # 2.1将列表里的学员对象转换成字典
        new_list = [i.__dict__ for i in self.student_list]
        print(new_list)
        # 2.2文件写入字符串数据,因文件内数据要求为字符串类型,故需先转换才能写入
        f.write(str(new_list))
        # 3.关闭文件
        f.close()

7、加载学员信息

需求:每次进⼊系统后,修改的数据是⽂件⾥⾯的数据

分析步骤

  • 尝试以 “r” 模式打开学员数据⽂件,如果⽂件不存在则以 “w” 模式打开⽂件
  • 如果⽂件存在则读取数据并存储数据
    – 读取数据
    – 转换数据类型为列表,并转换列表内的字典为对象
    – 存储学员数据到学员列表
  • 关闭⽂件
    # 2.8 加载学员信息
    def load_student(self):
        # 1.打开文件。尝试r打开,如果有异常w
        try:
            f = open("student.data", "r")
        except:
            f = open("student.data", "w")
        else:
            # 2.读取数据。文件读取出的是字符串还原为列表,把[{}]转换为[学员对象]
            data = f.read()  # data是字符串"[{}]"
            new_list = eval(data)
            self.student_list = [Student(i["name"], i["gender"], i["tel"]) for i in new_list]
        # 3.关闭文件
        finally:
            f.close()

八、小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 1.导入管理系统模块
from managerSystem import *

# 2.启动管理系统
# 保证是当前文件运行才启动管理系统:if--创建对象并调用run实例方法
if __name__ == "__main__":
    student_manager = StudentManager()
    student_manager.run()

在这里插入图片描述

from student import *

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

    # 一、程序入口函数,启动程序后执行的函数
    def run(self):
        # 1.加载文件里面的学员数据
        self.load_student()
        while True:  # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
            # 2.显示功能界面
            self.show_menu()  # 在类里面访问方法,self.方法名()
            # 3.用户输入功能序号
            menu_num = eval(input("请输入需要的功能序号:"))
            # 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):
        # 1.让用户输入姓名、性别、手机号
        name = input("请输入你的姓名:")
        gender = input("请输入你的性别:")
        tel = input("请输入你的手机号:")
        # 2.创建学员对象--类?类在student.py里,故要先导入student模块,再创建对象
        student = Student(name, gender, tel)
        # 3.将该对象添加到学员列表
        self.student_list.append(student)  # self.student_list的元素是类Student的对象
        # print(self.student_list)
        # print(student)

    # 2.3 删除学员函数
    def del_student(self):
        # 1.用户输入目标学员姓名
        del_name = input("请输入要删除的学员姓名:")
        # 2.遍历学员列表,如果用户输入的姓名存在则删除学员,否则提示用户不存在
        for i in self.student_list:  # i是列表元素,即类Student的对象
            if del_name == i.name:  # self.student_list列表里的元素是类Student创建的,具有类Student的属性和方法
                self.student_list.remove(i)
                break
        else:
            print("没有该学员,查无此人")
        # print(self.student_list)

    # 2.4 修改学员信息函数
    def modify_student(self):
        # 1.用户输入目标学员姓名
        modify_name = input("请输入要修改的学员姓名:")
        # 2.遍历列表数据,如果学员存在,修改学员信息;如果不存在,提示学员不存在
        for i in self.student_list:
            if modify_name == i.name:
                i.name = input("姓名:")
                i.gender = input("性别:")
                i.tel = input("手机号:")
                # print("修改成功,姓名{},性别{},手机号{}".format(i.name, i.gender, i.tel))
                break
        else:
            print("查无此人")

    # 2.5 查询学员信息函数
    def search_student(self):
        # 1.用户输入要查询的学员
        search_name = input("请输入要查询的学员姓名:")
        # 2.遍历列表,如果学员存在就打印学员信息,否则提示不存在
        for i in self.student_list:
            if search_name == i.name:
                print("姓名是:{},性别是:{},手机号是:{}".format(i.name, i.gender, i.tel))
                break
        else:
            print("查无此人")

    # 2.6 显示所有学员信息函数
    def show_student(self):
        # 1.打印表头
        print("姓名\t性别\t手机号")
        # 2.打印学员信息
        for i in self.student_list:
            print("{}\t{}\t{}".format(i.name, i.gender, i.tel))

    # 2.7 保存学员信息函数
    def save_student(self):
        # 1.打开文件
        f = open("student.data", "a")
        # 2.文件写入数据
        # 2.1将列表里的学员对象转换成字典
        new_list = [i.__dict__ for i in self.student_list]
        print(new_list)
        # 2.2文件写入字符串数据,因文件内数据要求为字符串类型,故需先转换才能写入
        f.write(str(new_list))
        # 3.关闭文件
        f.close()

    # 2.8 加载学员信息
    def load_student(self):
        # 1.打开文件。尝试r打开,如果有异常w
        try:
            f = open("student.data", "r")
        except:
            f = open("student.data", "w")
        else:
            # 2.读取数据。文件读取出的是字符串还原为列表,把[{}]转换为[学员对象]
            data = f.read()  # data是字符串"[{}]"
            new_list = eval(data)
            self.student_list = [Student(i["name"], i["gender"], i["tel"]) for i in new_list]
        # 3.关闭文件
        finally:
            f.close()

在这里插入图片描述
在这里插入图片描述

class Student:
    def __init__(self, name, gender, tel):
        self.name = name
        self.gender = gender
        self.tel = tel

    def __str__(self):
        return "姓名{},性别{},电话{}".format(self.name, self.gender, self.tel)

PS: source,itheima

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/114783025