这里写目录标题
目标
- 了解面向对象编程开发过程中 类内部功能的分析方法
- 了解常用功能 增 删 改 查
一 系统需求
使用面向对象编程思想 完成学员管理系统的开发,具体如下
- 系统要求: 学员数据存储在文件中
- 系统功能: ①添 删 改 查学员信息, ②显示所有学员信息, 保存学员信息 ③退出系统等功能
面向对象编程思想 : 分析角色 抽象成类 定义类 创建对象
二 准备程序文件
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