python-面向对象(5)

内容概览

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

设计模式

设计模式就是根据特定的问题总结出来的特定解决套路,是一种解决问题的思路
设计模式目前总共有23种
设计模式分为三类:创建型,结构型,行为型

  • 单例模式
    类加括号调用多次只会产生同一个对象
    class MyClass:
    	pass
    
    obj1 = MyClass()
    obj2 = MyClass()
    obj3 = MyClass()
    print(id(obj1))  # 2829763020160
    print(id(obj2))  # 2829763019104
    print(id(obj3))  # 2829763084496
    
    一般来说,类名只要加括号实例化对象,调用几次就会产生几个对象
    那有时候我们不希望频繁的产生不同的对象,只是希望通过对象使用到类里的方法
    如果产生的对象太多,会浪费一定的内存,所以需要使用到单例
    方式1:使用元类控制对象的产生
    class MyMetaClass(type):
        instance = None  # 记录当前类是否产生过对象
    
        def __call__(cls, *args, **kwargs):
            if cls.instance is None:
                cls.instance = super().__call__(*args, **kwargs)
                return cls.instance  # 如果是第一次产生,记录下来让后返回
            return cls.instance  # 如果不是第一次产生,直接返回记录的对象
    
    
    class MyClass(metaclass=MyMetaClass):
        def __init__(self, name):
            self.name = name
    
    
    obj1 = MyClass('jason')
    obj2 = MyClass('kevin')
    print(obj1.name, id(obj1))  # jason 1931974466000
    print(obj2.name, id(obj2))  # jason 1931974466000
    
    方式2:使用__new__方法
    class MyClass(object):
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            if cls.__instance is None:
                cls.__instance = super().__new__(cls)
                return cls.__instance
            return cls.__instance
    
        def __init__(self, name):
            self.name = name
    
    
    obj1 = MyClass('jason')
    print(obj1.name, id(obj1))  # kevin 2171191832336
    obj2 = MyClass('kevin')
    print(obj2.name, id(obj2))  # kevin 2171191832336
    在实例化对象自动调用__init__方法之前会先使用__new__方法创建一个空对象,记录第一次产生的对象,使后续都返回第一次产生的对象
    

pickle模块

pickle和json一样,都是作用于序列化数据的
pickle的优点是相比json模块的只能序列化基本数据类型,pickle能序列化python所有数据类型
pickle的缺点是不支持其他编程语言,只能够在python中使用

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

	def func(self):
		print('func')

obj = MyClass('jason')
需求:将对象保存到文件中,并且读取出来后还能够正常使用
如果直接使用文件读写,因为只能读写字符串格式,所以无法做到
而json模块则不支持对象的读写,因为对象不是数据类型,也无法使用派生方法重写JSONEncode的方式实现,目前可以先使用pickle方法
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.name)
pickle的方法和json一样
需要使用二进制模式传入数据

选课系统项目分析

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

  • 管理员功能:
    1. 注册
    2. 登录
    3. 录入老师
    4. 创建学校
    5. 创建课程
  • 讲师功能
    1. 登录
    2. 选择教授课程
    3. 查看班级学生
    4. 管理学生成绩
  • 学生功能
    1. 注册
    2. 登录
    3. 选择学校
    4. 选择课程
    5. 查看分数

选课系统架构设计

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

选课系统管理员注册功能代码逻辑

执行启动脚本,调用数据展示层src的启动函数,选择管理员接口,调用数据展示层admin_view的启动函数
选择注册功能,获取用户名和密码及确认密码,判断两次密码是否一致,相同则调用核心逻辑层的admin_interface接口
先判断用户名是否已经存在,所以先在model创建一个管理员的类,初始化对象的值,创建获取用户的方法,方法需要去db_handler查询数据,在db_handler定义一个查找当前传入对象是否存在的函数
通过类名点双下name的方式判断用户文件是否存在,再一层层上传结果
回到核心逻辑层,如果用户不存在,则使用类实例化一个对象,在model中再添加一个保存用户数据的方法,调用db_handler保存到文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值