内容概览
- 设计模式
- pickle模块
- 选课系统项目分析
- 选课系统架构设计
设计模式
设计模式就是根据特定的问题总结出来的特定解决套路,是一种解决问题的思路
设计模式目前总共有23种
设计模式分为三类:创建型,结构型,行为型
- 单例模式
类加括号调用多次只会产生同一个对象
一般来说,类名只要加括号实例化对象,调用几次就会产生几个对象class MyClass: pass obj1 = MyClass() obj2 = MyClass() obj3 = MyClass() print(id(obj1)) # 2829763020160 print(id(obj2)) # 2829763019104 print(id(obj3)) # 2829763084496
那有时候我们不希望频繁的产生不同的对象,只是希望通过对象使用到类里的方法
如果产生的对象太多,会浪费一定的内存,所以需要使用到单例方式1:使用元类控制对象的产生 class MyMetaClass(type): instance = None # 记录当前类是否产生过对象 def __call__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__call__(*args, **kwargs) return cls.instance # 如果是第一次产生,记录下来让后返回 return cls.instance # 如果不是第一次产生,直接返回记录的对象 class MyClass(metaclass=MyMetaClass): def __init__(self, name): self.name = name obj1 = MyClass('jason') obj2 = MyClass('kevin') print(obj1.name, id(obj1)) # jason 1931974466000 print(obj2.name, id(obj2)) # jason 1931974466000 方式2:使用__new__方法 class MyClass(object): __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: cls.__instance = super().__new__(cls) return cls.__instance return cls.__instance def __init__(self, name): self.name = name obj1 = MyClass('jason') print(obj1.name, id(obj1)) # kevin 2171191832336 obj2 = MyClass('kevin') print(obj2.name, id(obj2)) # kevin 2171191832336 在实例化对象自动调用__init__方法之前会先使用__new__方法创建一个空对象,记录第一次产生的对象,使后续都返回第一次产生的对象
pickle模块
pickle和json一样,都是作用于序列化数据的
pickle的优点是相比json模块的只能序列化基本数据类型,pickle能序列化python所有数据类型
pickle的缺点是不支持其他编程语言,只能够在python中使用
class MyClass(object):
def __init__(self, name):
self.name = name
def func(self):
print('func')
obj = MyClass('jason')
需求:将对象保存到文件中,并且读取出来后还能够正常使用
如果直接使用文件读写,因为只能读写字符串格式,所以无法做到
而json模块则不支持对象的读写,因为对象不是数据类型,也无法使用派生方法重写JSONEncode的方式实现,目前可以先使用pickle方法
import pickle
with open(r'a.txt', 'wb') as f:
pickle.dump(obj, f)
with open(r'a.txt', 'rb') as f:
data = pickle.load(f)
print(data.name)
pickle的方法和json一样
需要使用二进制模式传入数据
选课系统项目分析
选课系统
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
6. 创建讲师角色时要关联学校,
7. 提供三个角色接口
7.1 学员视图, 可以注册, 交学费, 选择班级,
7.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
7.3 管理视图,创建讲师, 创建班级,创建课程
8. 上面的操作产生的数据都通过pickle序列化保存到文件里
功能分析
- 管理员功能:
- 注册
- 登录
- 录入老师
- 创建学校
- 创建课程
- 讲师功能
- 登录
- 选择教授课程
- 查看班级学生
- 管理学生成绩
- 学生功能
- 注册
- 登录
- 选择学校
- 选择课程
- 查看分数
选课系统架构设计
三层架构
功能展示层
src.py
admin_view.py
teacher_view.py
student_view.py
核心逻辑层
admin_interface.py
teacher_interface.py
student_interface.py
数据处理层
db_handler
model.py
选课系统管理员注册功能代码逻辑
执行启动脚本,调用数据展示层src的启动函数,选择管理员接口,调用数据展示层admin_view的启动函数
选择注册功能,获取用户名和密码及确认密码,判断两次密码是否一致,相同则调用核心逻辑层的admin_interface接口
先判断用户名是否已经存在,所以先在model创建一个管理员的类,初始化对象的值,创建获取用户的方法,方法需要去db_handler查询数据,在db_handler定义一个查找当前传入对象是否存在的函数
通过类名点双下name的方式判断用户文件是否存在,再一层层上传结果
回到核心逻辑层,如果用户不存在,则使用类实例化一个对象,在model中再添加一个保存用户数据的方法,调用db_handler保存到文件