|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好:
最近看黑马程序员的视频复习的时候发现了一个有趣的问题。函数式编程和面向对像编程的不同。就是教学视频中那个学员(增删改查)系统。
基本情况:
1.学员的增删改查都要用列表保存数据。
2.学员有姓名,性别,年纪,电话等。这种保存型式用“字典”的方式来保存较合适。
3.也就是说,在“列表”中保存一个个“字典”,作为学生的数据信息库这个道理。
用函数式编程用到的代码如下(摘录):
""""""
info = []#学生信息的空列表,————里面用字典做为列表的数据
def add_info():
"""添加学员函数"""
# 1. 用户输入:学号、姓名、手机号
new_id = input('请输入学号:')
new_name = input('请输入姓名:')
new_tel = input('请输入手机号:')
# 2. 判断是否添加这个学员:如果学员姓名已经存在报错提示;如果姓名不存在添加数据
global info
# 2.1 不允许姓名重复:判断用户输入的姓名 和 列表里面字典的name对应的值 相等 提示
for i in info:
if new_name == i['name']:
print('此用户已经存在')
# return作用:退出当前函数,后面添加信息的代码不执行
return
# 2.2 如果输入的姓名不存在,添加数据:准备空字典,字典新增数据,列表追加字典
info_dict = {}
# 字典新增数据
info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel
# print(info_dict)
# 列表追加字典
info.append(info_dict)
print(info)
""""""
如上代码————————里面先将用户输入的信息先保存到一个字典info_dict{}里面,然后在最后用:info.append(info_dict)这个代码追加到info = []这个列表中。到目前为止,没问题。
但在后面的课程,面向对象编程时,我发现,面向对象部分没有了”字典“部分的代码,但依然实现了列表中追加字典数据的”健值对“:
from student import *#这是一个student的模块。在另一个表中,如果需要我再回帖粘过来。
class StudentManager(object):
def __init__(self):
self.student_list = [] #这是面向对象的列表,要向这个列表里追加数据,并且这个数据是会保存在硬盘上的数据。
#忽略中间的大部分代码。我先。
# 2.2 添加学员
def add_student(self):
# 1. 用户输入姓名、性别、手机号
name = input('请输入您的姓名:')
gender = input('请输入您的性别:')
tel = input('请输入您的手机号:')
# 2. 创建学员对象 -- 类 ?类在student文件里面 先导入student模块,再创建对象
student = Student(name, gender, tel)
# 3. 将该对象添加到学员列表
self.student_list.append(student)
print(self.student_list)
print(student)
问题:你们看,这个部分(2.2添加学员部分)没有字典化处理,直接输入相应的变量,后台保存的数据self.student_list = [] 为什么就成了一个个”健值对“了呢?
本帖最后由 阿奇_o 于 2021-10-24 15:16 编辑
其实是他用纯Python的方式自己实现了"数据对象的持久化功能"。
或者说是"序列化"和"反序列化",将运行时的内存对象保存到磁盘文件里,和反过来的功能。
比如,这里的save_student()即完成"序列化"的功能,把Student对象实例,写进了student.data文件里; load_student()则实现"反序列化"。
实际中,"持久化"应该用json或pickle这两个模块更常见。
------------
补充:简化成下面这样子,希望你看得懂~
- class Student:
- def __init__(self, name, gender, tel):
- self.name = name
- self.gender = gender
- self.tel = tel
- class StuManager():
- def __init__(self):
- self.student_list = []
- def save_student(self):
- """ 序列化 """
- with open('student.data', 'w') as f:
- new_list = [i.__dict__ for i in self.student_list]
- for i in self.student_list:
- print(i.__dict__)
- f.write(str(new_list))
- def load_student(self):
- """ 反序列化 """
- with open('student.data', 'r') as f:
- new_list = eval(f.read())
- self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
- # print(self.student_list)
- return self.student_list
- # 测试:
- s1 = Student('Alice', 'F', 13612341001)
- s2 = Student('Bill', 'M', 13612341002)
- sm = StuManager()
- sm.student_list.append(s1)
- sm.student_list.append(s2)
- sm.save_student() # 序列化到文件student.data
- del sm # 销毁实例,验证后面反序列化是否成功
- # print(sm.student_list) # 报错,因为sm已不存在。
- sm2 = StuManager()
- stu_list = sm2.load_student()
- print(stu_list) # 可以看到 反序列化的结果
- for obj in stu_list:
- print(obj.__dict__)
复制代码
|
|