设计模式,pickle模块

  • 设计模式
  • pickle模块
  • 选课系统项目分析
    • 功能分析
  • 系统架构设计
    • 三层架构

设计模式

  在IT行业有很多前辈针对固定的一些问题设计出了固定的解决套路

设计模式总共有23种(目前需要掌握的只有以下三类)

  创建型,结构型,行为型

设计模式之单例模式

  在我们之前学习的类中,一个类名加括号可以生成多个对象,但是如果我们使用类名加括号只允许产生一个对象的话就要用到我们今天所讲的设计模式之单例模式。

class MyClass:
    pass

obj1 = MyClass()
obj2 = MyClass()
obj3 = MyClass()
print(id(obj1), id(obj2), id(obj3)) # 2722359372336 2722364021680 2722359181760
# 像这样直接调用类名加括号,你调用几次类名加括号,他就会产生几个新的对象。

那么为什么要使用单例呢?

有时候我们不希望类频繁的产生不同的对象
          类中有很多很好用的方法 程序很多地方都需要使用(通过对象调用)
          如果产生的地方特别多 那么会浪费一定的内存空间 所以需要使用单例

方式一:使用元类干预对象的创建过程。

class MyMeTaClass(type):
        # 记录类是否已经创建了对象
        instance = None

        def __call__(self, *args, **kwargs):
            if self.instance:
                return self.instance
            # 获取空对象
            obj = super().__call__(*args, **kwargs)
            # 保存对象
            self.instance = obj
            # 返回空对象
            return obj

     class Single(metaclass=MyMeTaClass):
         def __init__(self, name):
                self.name = name

     obj1 = Single('jason')
     obj2 = Single('kevin')
     obj3 = Single('tony')
     print(id(obj1), id(obj2), id(obj3))
     print(obj1.name)
     print(obj2.name)
     print(obj3.name)

 

 

 

 

pickle模块

  pickle模块与json模块很像 都是用来做序列化 反序列化
  并且pickle模块支持python所有数据类型

  但是pickle不支持跨语言传输 只能python自己跟自己玩 兼容性不好

  为了比较方便的编写选课系统 我们需要将对象保存到文件 所以需要用该模块
后续我们不用 因为有更加高级的方法>>>:ORM(对象关系映射)

  之前我们许过的json模块中有dump,load等方法,而pickle模块和json有着相同的方法。(而json是针对于文件,字符串,pickle是针对于对象中的类型)

用pickle模块将对象的内容写入文件:

import pickle  # 导入pickle模块

class MyClass:
    def __init__(self, name):
        self.name = name

    def choice_course(self):
        print('%s正在选课' % self.name)
obj = MyClass('小可爱')
# 写入文件
with open(r'a.txt', 'wb') as f:  # 因为导入的是bytes类型所以要用wb
    f.write(pickle.dumps(obj))
    pickle.dump(obj, f)

随后就会产生一个a.txt的文件

用pickle模块将对象的内容文件导出:

import pickle  # 导入pickle模块

class MyClass:
    def __init__(self, name):
        self.name = name

    def choice_course(self):
        print('%s正在选课' % self.name)
obj = MyClass('小可爱')
# 导出文件
with open(r'a.txt', 'rb') as f:
    data = pickle.load(f) 
print(data)     # <__main__.MyClass object at 0x000001BE94095BB0>
print(data.name)    # 小可爱
data.choice_course()    # 小可爱正在选课
# 而且导出的内容可以加括号直接调用

选课系统项目分析

选课系统项目要求

 选课系统
  角色:学校、学员、课程、讲师
  要求:
    1. 创建北京、上海 2 所学校
    2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
    3. 课程包含,周期,价格,通过学校创建课程 
    4. 通过学校创建班级, 班级关联课程、讲师5. 创建学员时,选择学校,关联班级
    5. 创建讲师角色时要关联学校, 
    6. 提供三个角色接口  
    	6.1 学员视图, 可以注册, 交学费, 选择班级,  
    	6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩   
    	6.3 管理视图,创建讲师, 创建班级,创建课程
    7. 上面的操作产生的数据都通过pickle序列化保存到文件里

针对以上要求我们大概可以分出三个功能:

  管理员功能(最核心),讲师功能,学生功能

然后再次细分可以得到:

管理员功能(最核心) 讲师功能 学生功能
注册 注册 注册
登录 登录 登录
创建讲师 选择教授课程 选择学校
创建学校 查看教授课程 选择课程
创建课程 管理课程分数 查看分数

系统架构设计(三层架构)

功能展示层 核心逻辑层 数据处理层
src.py admin_interface.py db_hanlder.py
admin_view.py teacher_interface.py model.py
teacher_view.py student_interface.py  
student_view.py    

选课管理系统思维构图

                                               

 

posted @ 2022-08-01 18:40  没错,干就完了!  阅读(93)  评论(0)    收藏  举报