设计模式之单例模式以及pickle模块
设计模式
设计模式的定义
- 在IT行业有很多前辈针对固定的一些问题设计出的固定的解决套路,提升程序的性能
分类
设计模式大致有23种,可以分为如下三类:
- 创建型:工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式
- 结构型:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式
- 行为型:解释器模式、模版方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式
今天我们主要了解一下单例模式。
设计模式之单例模式
单例模式:即类加括号多次调用只允许产生一次对象
正常情况下,类加括号多次调用产生的对象都是不同的对象,但当我们不想因频繁的创建对象而过多的占用内存空间时,这个时候我们可以用单例模式来实现对类中方法的调用
'使用元类来干预对象的创建过程'
# 我们可以知道通过元类可以控制类的创建:__init__()方法
# 而通过元类控制对象就是利用__call__()方法
class MyMeTaClass(type):
# 设置一个变量用来接受对象的所有属性
instance = None
def __call__(self, *args, **kwargs):
# 先要判断这个变量是否为空,如果已经接受了对象,那么直接返回对象
if self.instance:
return self.instance
# 当instance为空,说明还没有创建对象,那么我们使用__call__方法产生对象
obj = super(MyMeTaClass, self).__call__(*args, **kwargs)
self.instance = obj
return obj
class MyClass(metaclass=MyMeTaClass):
pass
obj1 = MyClass()
obj2 = MyClass()
obj3 = MyClass()
print(id(obj1),id(obj2),id(obj3))
'如下图,所有对象的内存地址都相同,即同一对象--->单例模式'
pickle模块
pickle模块的作用
pickle模块与json模块很像,都是用来做序列化、反序列化的。并且pickle模块支持python所有的数据类型,但是pickle不支持跨语言传输,只能python自己跟自己玩,兼容性不好。
为了后期比较方便的编写选课系统,我们需要将对象保存到文件,所以需要用该模块,后续我们不用,因为有更高级的方法>>>:ORM(对象关系映射)
代码演示
class MyClass(object):
def __init__(self,name):
self.name = name
def run(self):
print(f'{self.name}正在跑步')
obj = MyClass('jason')
import pickle
# 因为常规的文件(像json)操作存储对象肯定不行,但是pickle支持所有python数据类型,写入需要二进制wb
# with open('obj_file','wb') as f:
# pickle.dump(obj,f)
with open('obj_file','rb') as f:
data = pickle.load(f)
print(data)
print(data.name)
data.run()
浙公网安备 33010602011771号