单例模式实现方式及pickle模块
昨日内容回顾
-
面向对象之魔法方法
类中在特定情况下会自动触发的方法称为魔法方法。常见的魔法方法有:
__init__ # 需要传特征数据的对象生成时自动触发 __str__ # 对象被执行打印操作时自动触发 __call__ # 对象使用加括号调用时自动触发 __getattr__ # 对象调用类内没有的名称时自动触发 __getattribute__ # 对象调用名称时自动触发,优先级高于__getattr__ __setattr__ # 对象对名称进行进行赋值操作时自动触发 __enter__ # 对象作为with上下文管理的对象开始时自动触发,并将返回值赋值给as后变量名 __exit__ # 对象作为with上下文管理的对象结束时自动触发 -
面向对象之元类
产生类的类即为元类。生成对象时,默认元类为type。
-
元类定制类的产生
与类生成对象类似,元类生成类时,会调用元类内的双下init方法,通过对元类的双下init进行派生完成定制。
-
元类定制对象的产生
对象加括号调用是调用类中的双下call方法,与此类似,类加括号调用生成对象实质是调用元类中的双下call方法,通过对元类的双下call方法进行派生完成对类生成对象的定制。
-
魔法方法之双下new
双下new是生成空对象的魔法方法。一个新对象的生成不是一步到位的,第一步是生成一个空对象,第二步是调用类中的双下init为名称空间添加名字,第三步将生成的新对象返回。
-
设计模式简介
设计模式分为三种类型:创建型、结构型及行为型,共23种模式。
今日内容概要
- 单例模式的实现方法
- 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
通过装饰器实现
定义装饰器,先实例化一个对象,如果调用者要重新实例化对象,则为调用者实例化,如果不需要实例化新对象,则返回已经实例化后的对象。
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模块使用
pickle模块与json模块使用方法相同,其优点是可以序列化各种类型的数据,缺点是只可以在python中使用,且序列化后的对象在反序列化之后,要想使用必须要与实例化对象的类在同一文件中。
选课系统需求分析
选课系统
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建Linux , python , go 3个课程 , Linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供三个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
选课系统结构框架
选课系统框架与ATM购物车框架相似,区别是:
选课系统用户交互层需要有3个接口,分别与接口层三个接口相照应;
由于要使用pickle模块,数据交互层需要分离出一个models模块以完成对类数据的操作;
数据存储时要区分用户身份,方便查看;
登录成功后不仅要记录用户名,还需要记录用户的身份。

浙公网安备 33010602011771号