Python 面向对象 (六) 实例学员管理系统

请添加图片描述

目标

  • 了解面向对象编程开发过程中 内部功能的分析方法
  • 了解常用功能 增 删 改 查

一 系统需求

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

  • 系统要求: 学员数据存储在文件中
  • 系统功能: ①添 删 改 查学员信息, ②显示所有学员信息, 保存学员信息 ③退出系统等功能

面向对象编程思想 : 分析角色 抽象成类 定义类 创建对象

二 准备程序文件

2.1 分析

  • 角色分析
    • 学员
    • 管理系统

工作中注意事项
1 为了方便维护代码, 一般一个角色 一个程序文件
2 项目要有主程序入口 ,习惯为 main.py

2.2 创建程序文件

① 创建项目目录 例如 Student管理系统
② 创建程序文件

  • 程序入口文件 :main.py
  • 学员文件:学生登记.py
  • 管理系统文件:管理系统.py

三 书写程序

3.1 学生登记.py

需求 :

  • 学员信息包括:姓名 性别 手机号
  • 添加 __str__魔法函数, 方便查看学员对象信息

3.1.2 程序代码

class 学生登记():
    def __init__(self,姓名,性别,手机):
        # 姓名 性别 电话
        self.姓名=姓名
        self.性别=性别
        self.手机=手机
    def __str__(self):
        # 目的 输出不是内存地址,而是具体内容
        return f"{self.姓名},{self.性别},{self.手机}"
# 创建对象 临时验证上面代码
# 小明=Student("小明","nv",17753355555)
# print(小明)
"""小明,nv,17753355555"""

3.2 管理系统.py

需求:

  • 储存数据的位置:文件 学生信息.data
    • 加载文件数据
    • 修改数据后保存到文件
  • 储存数据的形式: 列表储存学员对象
  • 系统功能
    • 增删改查
    • 显示所有学员信息
    • 保存学员信息

3.2.1 定义类

class 管理系统():
    def __init__(self):
        # 储存数据所用的列表
        self.学生列表t=[]

3.2.2 管理系统框架

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

  • 步骤
    • 一 定义程序入口函数
      • 加载数据
      • 显示功能菜单
      • 用户输入功能序号
      • 根据用户输入的序号 执行不同的功能
    • 二 定义系统功能函数,添加\删除学员等

结构 1 :入口函数

class 类_管理系统():
    def __init__(self):
        self.学生列表=[]
    """ 一 入口函数"""
    def run(self):
        # 1 加载文件,获取学生数据
        # 2 显示功能列表
        # 3 用户输入 选择功能序号
        # 4 根据不同序号,实现不同功能
    """二 功能函数"""
> 以上 结构:  类下面 , ① init初始化 学生列表, 
					  ② 入口函数  run  和功能函数  ,其实都是一样的   ,

结构2 :功能函数

class 类_管理系统():
    def __init__(self):
        self.学生列表=[]
    """ 一 入口函数"""
    def run(self):
		# 2 显示功能列表
        self.可选功能()  #类里面调用实例方法,要用self
        
    """二 功能函数"""
    # 2.1 显示功能菜单
    @staticmethod
    def 可选功能():  #静态函数括号里面  没有self
        print("请选择如下功能:")
        print("1: 增")

结构3 加while – 这样配合 main.py就可以跑起来了

#--*coding:utf-8*--
class 类_管理系统():
    def __init__(self):
        self.学生列表=[]
    """ 一 入口函数"""
    def run(self):
        # 1 加载文件,获取学生数据
        pass
        while True:
            # 2 显示功能列表
            self.可选功能()  #类里面调用实例方法,要用self
            # 3 用户输入 选择功能序号
            功能序号=int(input("请选择你要的功能:"))
            # 4 根据不同序号,实现不同功能
            if 功能序号==1:
                self.()
            elif 功能序号==2:
                self.()
            elif 功能序号==7:
                break
    """二 功能函数"""
    # 2.1 显示功能菜单  静态函数
    @staticmethod
    def 可选功能():  #静态函数括号里面  没有self
        print("请选择如下功能:")
        print("1: 增")
        print("2: 删")
    # 2.2 增
    def(self):
        print("增")
    # 2.3 减
    def(self):
        print("减")
    # 2.4 改
    # 2.5 查
    # 2.6 显示全部
    # 2.7 保存
    # 2.8 加载

# 验证
if __姓名__=="__main__":
    一中=类_管理系统()
    print(一中.可选功能())
    print(类_管理系统.可选功能())

3.3 main.py

需求

  • 导包"管理系统",
  • 创建对象,启动程序
#--*coding:utf-8*--
# 导包
from  管理系统 import *
# 创建对象 启动管理系统
二中=类_管理系统()
二中.run()

到此 大框架 ok了 程序 可以正常跑起来了

3.4 定义系统功能函数

3.4.1 增

  • 需求 用户输入姓名性别,将学生添加到系统

  • 步骤

    • 用户输入姓名… input
    • 创建 对象 学生=学生登记类(姓名,性别,手机)
    • 将学员添加到列表 self.学生列表.append(学生)
  • 初始1 代码

    # 2.2 增
    def(self):
        # 1 请用户输入姓名等
        # 2 创建学生对象
        # 3 将该对象添加到学生列表
  • 代码
#添加学员函数  需要创建学员对象,故先导入 *学生登记* 模块>
from 学生登记 import *
class 管理系统():
       ..........
    # 2.2 增
    def(self):
        # 1 请用户输入姓名等
        姓名=input("请输入您的姓名:")
        性别=input("请输入您的性别:")
        手机=input("请输入您的手机:")
        # 2 创建学生对象   ,到此 应该引入学生登记.py
        学生=学生登记类(姓名,性别,手机)
        print(学生)
        # 3 将该对象添加到学生列表
        self.学生列表.append(学生)d
        print(self.学生列表)    	

3.4.2 减

  • 需求 用户输入姓名,如果在列表中 ,就删除此条学员信息
  • 步骤
    • 用户输入 姓名
    • 历遍学员数据列表, 是否存在,若在就删除 ,不在就打印"查无此人"
  • 初始1 代码
    # 2.3 减	
    def(self):
        # 1 用户输入学员姓名
        # 2 历遍列表 若在 就删除,不在提示"查无此人"
  • 代码
#添加学员函数  需要创建学员对象,故先导入 *学生登记* 模块>
from 学生登记 import *
class 管理系统():
       ..........
    # 2.3 减
    def(self):
        # 1 用户输入学员姓名
        减学生=input("请输入你要删除学生的姓名:")
        # 2 历遍列表 若在 就删除,不在提示"查无此人"
        for i in self.学生列表:
            if i.姓名==减学生:
                # 删除该学生对象
                self.学生列表.remove(i)
                break
        # 历遍完列表,
        else:print("查无此人")
        print(self.学生列表)

3.4.3 改

需求 用户输入姓名,如果有就更新对象信息,没有就新建
步骤

  • 用户输入姓名 \性别\ 手机
  • 历遍学生列表,在就更新,不在就"查无此人"

代码

    # 2.4 改
    def(self):
        # 1 用户输入姓名 \性别\ 手机
        改学生=input("请输入要修改的学生姓名:")
        # 2 历遍学生列表, 在就更新, 不在就"查无此人"
        for i in self.学生列表:
            if i.姓名==改学生:
                i.姓名=改学生
                i.性别=input("请输入学员性别:")
                i.手机=input("请输入学员手机:")
                print(f"该学生信息修改成功,姓名:{改学生},性别:{i.性别},手机:{i.手机}")
                break
        else:print("查无此人")

3.4.4 查

需求 用户输入姓名 查找是否有
代码

    # 2.5 查
    def(self):
        查学生=input("请输入你要查找的学员姓名:")
        for i in self.学生列表:
            if i.姓名==查学生:
                print(f"该学生信息如下,姓名:{查学生},性别:{i.性别},手机:{i.手机}")
                break
        else:print("查无此人")

3.4.5 查看所有

需求 表格 形式 查看所有学生信息
代码

    # 2.6 显示全部
    def 查看全部(self):
        print("姓名\t性别\t手机")
        for i in self.学生列表:
            print(f"{i.姓名}\t{i.性别}\t{i.手机}")

3.4.6 保存学员信息

  • 需求 将修改后的学生数据 储存到文件
  • 步骤
    • 打开文件
    • 把数据写入 文件
    • 关闭文件

1 写入文件的数据是 学员对象的内存地址吗? 不能是! 应该是能看懂的数据
2 文件内 应该是什么样的 数据类型? 字符串 字典 [{“王五”:“王五”,“男”,“1775”}]

  • 拓展 dict

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

class A():
    a=0   # 类属性
    def  __init__(self):
        self.b=1  #实例对象 属性
aa=A()
# 返回 类内的所有
print(A.__dict__)
# 只 返回实例对象 相关
print(aa.__dict__)

"""
{'__module__': '__main__', 'a': 0, ....}  # 字典文件
{'b': 1}  # 字典文件
"""

-初始代码

    # 2.7 保存
    def 保存(self):
        # 1 打开文件
        f=open("学生信息.bata","w")
        # 2 把数据写入文件  
        # 2.1 [学员对象]转换成[列表字典]  
        [i.__dict__ for i in 学员对象]
        # 2.2 文件以 字符串写入  str()
        f.write(str(新学生列表))        
        # 3 关闭文件
        f.close()

代码

    # 2.7 保存
    def 保存(self):
        # 1 打开文件
        f=open("学生信息.bata","w")
        # 2 把数据写入文件
        # 2.1 注意1: 文件写入不能是内存地址,[学生对象]]转换成 [ 列表字典]
        新学生列表=[i.__dict__ for i in self.学生列表]
        """列表推导式"""
        """[{"姓名":"王五","性别":"男","手机":"111"}]"""
        print(新学生列表)
        # 2.2 注意2 : 文件内数据要求为 字符串 ,需要先把数据类型 转换成  字符串, 才能写入
        f.write(str(新学生列表))
        # 3 关闭文件
        f.close()    

保存完毕后 ,在pycharm目录里面 看不到, 保存好的文件, 要到 资源管理器中找
打开 data文件 之后
[{‘姓名’: ‘aa’, ‘性别’: ‘bb’, ‘手机’: ‘132’}]

3.4.8 加载学员信息

  • 需求 每次进入系统后,修改的数据是文件里面的数据 ??
  • 步骤
    • 1 [打开文件] 尝试以 r 打开, 如果异常 w 打开
    • 2 [读取文件] 文件读取的是字符串,要还原成 列表:[{}]→[学员对象]
    • 3 [关闭文件]
  • 代码
    def 加载(self):
        # 1  [打开文件]  尝试以  r  打开, 如果异常  w 打开
        try:
            f=open("学生信息.bata","r")
        except:
            f=open("学生信息.bata","w")
        else:
            # 2  [读取文件]  文件读取的是字符串,要还原成 列表:[{}]→[学员对象]
            # 2.1 读取文件  字符串
            数据=f.read()
            # 2.2 把字符串  还原成 列表类型
            新列表=eval(数据)
            # 创建 学生登记类对象  学生登记类(姓名,性别,手机)  并赋值到  self.学生列表
            self.学生列表=[学生登记类(i["姓名"],i["性别"],i["手机"]) for i in 新列表]

        finally:
            # 3  [关闭文件]
            f.close()

==================================

四 全部代码

4.1 学生登记.py

#--*coding:utf-8*--
# 定义类 初始化信息
class 学生登记类():
    # 初始化 学生信息
    def __init__(self,姓名,性别,手机):
        self.姓名=姓名
        self.性别=性别
        self.手机=手机
    # 返回值,   str目的是把返回的内存地址,转换成..
    def __str__(self):
        return f"{self.姓名},{self.性别},{self.手机}"

# 测试
if __name__=="__main__":
    张三=学生登记("张三","男",1775)
    # print("姓名\t性别\手机")
    print(张三)
    print(学生登记类)

4.2 管理系统.py

#--*coding:utf-8*--
from 学生登记 import *
class 类_管理系统():
    def __init__(self):
        self.学生列表=[]
    """ 一 入口函数"""
    def run(self):
        self.加载()
        while True:
            # 2 显示功能列表
            self.可选功能()  #类里面调用实例方法,要用self
            # 3 用户输入 选择功能序号
            功能序号=int(input("请选择你要的功能:"))
            # 4 根据不同序号,实现不同功能
            if 功能序号==1:
                self.()
            elif 功能序号==2:
                self.()
            elif 功能序号==3:
                self.()
            elif 功能序号==4:
                self.()
            elif 功能序号==5:
                self.查看全部()
            elif 功能序号==6:
                self.保存()
            elif 功能序号==7:
                self.加载()
            elif 功能序号==8:
                break
    """二 功能函数"""
    # 2.1 显示功能菜单  静态函数
    @staticmethod
    def 可选功能():  #静态函数括号里面  没有self
        print("请选择如下功能:")
        print("1: 增")
        print("2: 删")
        print("3: 改")
        print("4: 查")
        print("5:查看全部")
        print("6:保存学员信息")
        print("7: 加载")

    # 2.2 增
    def(self):
        # 1 请用户输入姓名等
        姓名=input("请输入您的姓名:")
        性别=input("请输入您的性别:")
        手机=input("请输入您的手机:")
        # 2 创建学生对象   ,到此 应该引入学生登记.py
        增学生=学生登记类(姓名,性别,手机)
        print(增学生)
        # 3 将该对象添加到学生列表
        self.学生列表.append(增学生)
        print(self.学生列表)
    # 2.3 减
    def(self):
        # 1 用户输入学员姓名
        减学生=input("请输入你要删除学生的姓名:")
        # 2 历遍列表 若在 就删除,不在提示"查无此人"
        for i in self.学生列表:
            if i.姓名==减学生:
                # 删除该学生对象
                self.学生列表.remove(i)
                break
        # 历遍完列表,
        else:print("查无此人")
        print(self.学生列表)
    # 2.4 改
    def(self):
        # 1 用户输入姓名 \性别\ 手机
        改学生=input("请输入要修改的学生姓名:")
        # 2 历遍学生列表, 在就更新, 不在就"查无此人"
        for i in self.学生列表:
            if i.姓名==改学生:
                i.姓名=input("请输入学员姓名:")
                i.性别=input("请输入学员性别:")
                i.手机=input("请输入学员手机:")
                print(f"该学生信息修改成功,姓名:{i.姓名},性别:{i.性别},手机:{i.手机}")
                break
        else:print("查无此人")

    # 2.5 查
    def(self):
        查学生=input("请输入你要查找的学员姓名:")
        for i in self.学生列表:
            if i.姓名==查学生:
                print(f"该学生信息如下,姓名:{查学生},性别:{i.性别},手机:{i.手机}")
                break
        else:print("查无此人")

    # 2.6 显示全部
    def 查看全部(self):
        print("姓名\t性别\t手机")
        for i in self.学生列表:
            print(f"{i.姓名}\t{i.性别}\t{i.手机}")
    # 2.7 保存
    def 保存(self):
        # 1 打开文件
        f=open("学生信息.bata","w")
        # 2 把数据写入文件
        # 2.1 注意1: 文件写入不能是内存地址,[学生对象]]转换成 [ 列表字典]
        新学生列表=[i.__dict__ for i in self.学生列表]
        """列表推导式"""
        """[{"姓名":"王五","性别":"男","手机":"111"}]"""
        print(新学生列表)
        # 2.2 注意2 : 文件内数据要求为 字符串 ,需要先把数据类型 转换成  字符串, 才能写入
        f.write(str(新学生列表))
        # 3 关闭文件
        f.close()
    # 2.8 加载
    def 加载(self):
        # 1  [打开文件]  尝试以  r  打开, 如果异常  w 打开
        try:
            f=open("学生信息.bata","r")
        except:
            f=open("学生信息.bata","w")
        else:
            # 2  [读取文件]  文件读取的是字符串,要还原成 列表:[{}]→[学员对象]
            # 2.1 读取文件  字符串
            数据=f.read()
            # 2.2 把字符串  还原成 列表类型
            新列表=eval(数据)
            # 创建 学生登记类对象  学生登记类(姓名,性别,手机)  并赋值到  self.学生列表
            self.学生列表=[学生登记类(i["姓名"],i["性别"],i["手机"]) for i in 新列表]

        # 3  [操作文件]  增删改查

        # 4  [储存文件]  储存学生数据到学生列表
        finally:
            # 5  [关闭文件]
            f.close()

# 验证
if __name__=="__main__":
    一中=类_管理系统()
    print(一中.可选功能())
    print(类_管理系统.可选功能())

4.3 主程序 main.py

#--*coding:utf-8*--
# 导包
from  管理系统 import *
# 创建对象 启动管理系统
二中学生管理系统=类_管理系统()
二中学生管理系统.run()

五 总结

  • 函数
    • 定义和调用
    • 参数的使用
  • 面向对象
    • 定义类
    • 创建对象
    • 定义和调用实例属性
    • 定义和调用实例方法
  • 数据类型
    • 列表
      • 增删改查
      • 列表推导式
    • 字典 [{}]
    • 字符串
  • 文件操作
    • 打开
    • 读写 字符串类型
    • 关闭

5.2 特别注意 列表推导式

  • [对象] → [列表字典] → [字符串] → [写入]

新学生列表=[i.dict for i in self.学生列表]
str(新学生列表)

  • [文本] → [字符串] → [列表] → [对象]

数据=f.read()
新列表=eval(数据)
self.学生列表=[学生登记类(i[“姓名”],i[“性别”],i[“手机”]) for i in 新列表]

文字 整理于 B站https://www.bilibili.com/video/BV1ex411x7Em/?spm_id_from=autoNext

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值