python(选课系统项目解析,pickle模块)

今日内容概要

  • 单例模式实现的多种方式
  • pickle序列化模块
  • 选课系统的需求分析
  • 选课系统架构设计
  • 选课系统目录搭建
  • 选课系统的管理员工能

image

单例模式实现的多种方式

# #单例模式1
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('水水',100)
        return cls.__instance


obj =C1.singleton()
obj2 = C1.singleton()
obj3 = C1.singleton()
print(id(obj),id(obj2),id(obj3))  #id 相同 1981485794784 1981485794784 1981485794784

obj4 = C1('momo',18)
obj5=C1('思思',18)
print(id(obj4),id(obj5)) # 2785972462832 2785972462784


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


    def __call__(self,*args,**kwargs):
        if args or 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


obj = Mysql()
obj2 = Mysql()
print(id(obj),id(obj2))  # id 相同2234070663904 2234070663904
obj3 = Mysql('momo',18)
obj4 = Mysql('水水',100)
print(id(obj3),id(obj4)) # 改变了2093957624832 2093957981424

#单例模式三:
"""基于模块的单例模式:提前产生一个对象,之后到模块使用"""

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


obj = C1('默默')



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,name,age):
        self.name = name
        self.age = age

obj1 = Mysql()
obj2 = Mysql()
obj3 = Mysql()
print(obj1 is obj2 is obj3)  # True
obj4 = Mysql('胖胖',100)
obj5 = Mysql('水水',1000)
print(obj3 is obj4)  # False

image

pickle序列化模块

Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。也就是说,pickle 可以实现 Python 对象的存储及恢复。

pickle 模块提供了以下 4 个函数供我们使用:

  • dumps():将 Python 中的对象序列化成二进制对象,并返回;
  • loads():读取给定的二进制对象数据,并将其转换为 Python 对象;
  • dump():将 Python 中的对象序列化成二进制对象,并写入文件;
  • load():读取指定的序列化数据文件,并返回对象。

dumps() 和 loads() 是基于内存的python对象与二进制互转
dump() 和 load() 是基于文件的python对象与二进制互转

案例:

优势:能够序列化python中所有的类型
缺点:只能在这python中使用,无法快约语言传输

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


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

    def func1(self):
        print('运行了第一个功能')

    def func2(self):
        print('运行了第二个功能')

    def func3(self):
        print('运行了第三个功能')


obj = C1('水水',100)

"""如果想要将数据进行保存,就会想到json序列化,可是json模式并不支持所有的数据
类型,这是后就用到python提供的序列化  pickle 序列化"""
"""以为在pickle中,所有存进去的数据都会转成二进制,所以在读写模式的时候加上b模式"""
#存数据
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) #<__main__.C1 object at 0x00000215575908E0>
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序列化保存到文件里

选课系统架构设计

三层架构
与ATM架构设计的差异
1.第一层做分层展示
2.第三层创建models.py存储所有的类 只有该py文件内的代码有资格调用db_handler

image

选课系统目录搭建

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

选课系统使用到的功能:

函数 装饰器  循环 功能字典 模块 类

image

posted @ 2022-11-09 15:45  亓官扶苏  阅读(70)  评论(0)    收藏  举报