单例模式实现的多种方式、pickle模块、选课系统
今日内容
-
单例模式实现的多种方法
-
pickle序列化模块
-
选课系统需求分析
-
功能提炼
-
选课系统架构设计
-
选课系统目录搭建
-
选课系统功能搭建
单例模式实现的多种方法
# 方式一:定义一个类实现单例
class C1:
__instance = None
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod # 运用类的绑定
def singleton(cls):
if not cls.__instance:
cls.__instance = cls('jason', 18)
return cls.__instance
obj1 = C1.singleton()
print(obj1.name) # jason
obj2 = C1.singleton()
print(obj2.name) # jason
obj3 = C1('tony',18)
print(obj3.name) # tony
# 方式二:定制元类实现单例模式
class Mymeta(type):
def __init__(cls, what, bases=None, dict=None): # 产生类的时候调用
# 事先从配置文件中去配置来造一个Mysql的实例出来
cls.__instance = cls.__new__(cls) # 产生对象
cls.__init__(cls.__instance, 'jason', 18) # 初始化对象
# 上述两步可以合成下面一步
# slef.__instance = super().__call__(*args, **kwargs)
super().__init__(what, bases, dic)
def __call__(cls, *args, **kwargs): # 如果调用类加括号 括号里面有值走这
if args or kwargs:
obj = cls.__new__(cls)
cls.__init__(obj, *args, **kwargs)
return obj
return cls.__instance # 括号里面没有值 直接将产生的时候定义好的对象返回赋值 这样保证类加括号没值调用的时候 返回的永远都是同一个对象
class Mysql(metaclass=Mymeta):
def __init__(self, name, age):
self.name = name
self.age = age
obj1 = Mysql()
obj2 = Mysql()
print(obj1.name) # jason
print(obj2.name) # jason
obj3 = Mysql('tony', 18)
print(obj3.name) # tony
# 方式三:基于模块的单例模式:提前产生一个对象 之后导模块使用
class C1:
def __init__(self, name):
self.name = name
obj = C1('jason') # 提前定义好 之后再通过到模块的方式通过对象obj去调
# 方式四:基于装饰器的单例模式
class C1:
def __init__(self, name):
self.name = name
obj = C1('jason')
def outer(cls):
_instance = cls('jason', 18)
def inner(*args, **kwargs):
if args or kwargs:
obj = cls(*args, **kwargs)
return obj
return _instance
return inner
@outer # Mysql = outer(Mysql)
class Mysql:
def __init__(self, host, port):
self.host = host
self.port = port
总结:单例模式想要实现的话 提前先让类产生一个对象 再提前去存放好 当类加括号实例化对象的时候去判断对象有无传参来判断是要产生新的对象还是用提前存放好的单例模式
pickle序列化模块
优势:能够序列化python中所有的类型
缺陷:只能够在python中使用 无法跨语言传输
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
需求:产生一个对象并保存到文件中 取出来还是一个对象
"""
class C1:
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print('from func1')
def func2(self):
print('from func2')
obj = C1('jason', 18)
# import json
# with open(r'a.txt','w',encoding='utf8') as f:
# json.dump(obj, f)
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)
data.func1()
data.func2()
print(data.name)
选课系统需求分析
选课系统
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供三个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
功能提炼
1.管理员功能
注册功能
登录功能
创建学校
创建课程
创建老师
2.讲师功能
登录功能
选择课程
查看课程
查看学生分数
修改学生分数
3.学生功能
注册功能
登录功能
选择学校
选择课程
查看课程分数
选课系统架构设计
三层架构
参考截图
与ATM架构设计的差异
1.第一层做分层展示
2.第三层创建models.py存储所有的类 只有该py文件内的代码有资格调用db_handler
选课系统目录搭建
基于软件开发目录规范即可
选课系统功能搭建
空函数 循环 功能字典
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现