单例 pickle模块
阅读原文时间:2023年07月08日阅读:3

今日内容

方式一:
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

obj = C1.singleton()
obj1 = C1.singleton()
print(id(obj),id(obj1))

方式二:
class Mymeta(type):
    def __init__(self, name, bases, dic):  # 定义类Mysql时就触发
        # 事先先从配置文件中取配置来造一个Mysql的实例出来
        self.__instance = object.__new__(self)  # 产生对象
        self.__init__(self.__instance, 'jason', 18)  # 初始化对象
        # 上述两步可以合成下面一步
        # self.__instance=super().__call__(*args,**kwargs)
        super().__init__(name, bases, dic)

    def __call__(self, *args, **kwargs):  # Mysql(...)时触发
        if args or kwargs:  # args或kwargs内有值
            obj = object.__new__(self)
            self.__init__(obj, *args, **kwargs)
            return obj
        return self.__instance

class Mysql(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age
obj1 = Mysql()
obj2 = Mysql()
print(id(obj1), id(obj2))
obj3 = Mysql('tony', 321)
obj4 = Mysql('kevin', 222)
print(id(obj3), id(obj4))

方式三:
#基于模块的单例模式:提前产生一个对象 之后到模块使用
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
class Mysql:
    def __init__(self,name,age):
        self.name = name
        self.age = age

obj2 = Mysql()
obj1 = Mysql()
print(obj2 is obj1)


优势:能够序列化python中的所有类型
劣势:只能够在python中使用 无法跨语言传输

需求:产生一个对象并保存到文件中 取出来还是一个对象

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

    def func(self):
        print('hhhh')
    def func1(self):
        print('xxxx')

obj = C1('jason')
import pickle
with open(r'a.txt','wb')as f:
    pickle.dump(obj,f)

with open(r'a.txt','rb')as f
    date = pickle.load(f)



选课系统
       角色:学校、学员、课程、讲师
      要求:
    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


基于软件开发目录规范即可


空函数 循环 功能字典