首页 > 编程语言 >进入python的世界_day30_python基础—— 单例设计模式、pickle模块、选课系统初步搭建

进入python的世界_day30_python基础—— 单例设计模式、pickle模块、选课系统初步搭建

时间:2022-11-09 19:23:17浏览次数:54  
标签:__ 序列化 name 选课 python self 设计模式 pickle cls

一、面向对象——单例模式代码实操

​ 方法有很多,其实就是定制产生类,或者产生对象

1.基于双下new,控制实例化对象的条件

class MyClass:

    _instance = None

    def __new__(cls, *args, **kwargs):

        if not cls._instance:

            cls._instance = super().__new__(cls)

        return cls._instance

    def __init__(self, name, age):

        self.name = name

        self.age = age


a = MyClass('jack', 88)

b = MyClass('tom', 66)

print(id(a), id(b))

2.利用元类,元类是用于创建类对象的类,类对象创建实例对象时一定会调用双下call方法,因此控制双下call始终只创建一个实例即可

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__call__(*args, **kwargs)

        return cls._instance


class A(metaclass=Singleton):
    pass


foo1 = A()

foo2 = A()

print(id(foo1), id(foo2))
>>>
2528927388480 2528927388480

3.基于模块的单例,创一个类,把这个类的文件当作模块,导模块,导了一次就不会再导,所以一定就只有一个对象

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

obj = C1('jason')
——————————————————————————————————————
在别的文件导一下创这个类的文件(导模块嘛),不管别的文件点多少次,对象不会变

二、pickle序列化模块

和我们前一阵学的json类似,都是序列化数据用来存取,能够实现任意对象与文本之间的相互转化,四种表达用法也是和json一致

与json的区别:

1.pickle转都是对象与二进制之间的转化

2.json序列化后是字符串,pickle序列化后是字节类型

3.json(文本转换形式下)转换后的数据我们看得懂,pickle是完全看不懂

4.json打开被序列化文件以文本形式打开,而pickle只能以二进制模式打开

5.json通吃很多编程语言,而pickle离开Python就不行

6.pickle序列化对象后,可以直接在当前py文件下用句点符访问到名称空间

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

    def func1(self):
        print('来自 func1')

    def func2(self):
        print('来自 func2')


obj = C1('jack', 28)

import pickle

with open(r'a.txt', 'wb') as f:
    pickle.dump(obj, f)
with open(r'a.txt', 'rb') as f:
    info = pickle.load(f)
print(info)
info.func1()
info.func2()
print(info.name)
>>>
<__main__.C1 object at 0x000001C2A8D06EE0>
from func1
from func2
jack

三、选课系统需求分析

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

四、选课系统架构设计

​ 其实还是前一阵写ATM系统的三层框架,但是start.py不存在bin里而是放在根目录,第三层数据层新增一个模块models用来存放所有的类,如果要调用数据做事情得先经过models(其实是强行加的用来练习对面向对象的熟练程度)

​ 大框架还是第一层是用户视图层,不过为了让这个系统真的像个正儿八经的系统,第一层只展示不同身份的用户的视觉界面,选啥系统再对接到啥接口层上去

标签:__,序列化,name,选课,python,self,设计模式,pickle,cls
From: https://www.cnblogs.com/wznn125ml/p/16874873.html

相关文章