设计模式与pickle模块
设计模式是什么
是前辈们发明的经过反复验证用于解决固定问题的固定套路
设计模式的类型
在IT行业中设计模式总共有23种,可以分为三大类
1.创建型
2.结构型
3.行为型
单例模式
单例模式:是指一个类只能产生一个对象,用于节省资源
应用场景:有一个类中有很多非常厉害的绑定给对象的方法,需要在很多地方使用,不同人来用不知道有没有产生对象,所以自己会创建一个新对象,如此往复会造成资源的浪费,因此单例模式应运而生
#如何实现:在类实例化对象的时候干涉>>>元类
class Single(type):
new_obj = None # 设置一个标志,产生过对象则该改变
def __call__(self,*args,**kwargs):
if not self.new_obj: # 判断标志不为空时
obj = super().__call__(*args,**kwargs) # 获取双下call的返回值
self.new_obj = obj # 将返回值赋值给new_obj,便于下面获取已经获取过一次的对象值
return self.new_obj
return self.new_obj # 已经产生对象,使用产生过的一个对象
class MyClass(metaclass=Single):
def __init__(self,name):
self.name = name
obj1 = MyClass('jason')
obj2 = MyClass('tony')
print(obj1.__dict__,obj2.__dict__) # {'name':'jason'} {'name':'jason'}
pickle模块
(1)pickle模块:
pickle模块是python语言的一个系统内置模块,安装python后已包含pickle库,不需要单独再安装。
(2)pickle模块的特点:
1、只能在python中使用,只支持python的基本数据类型,是python独有的模块。
2、序列化的时候,只是序列化了整个序列对象,而不是内存地址。
3、pickle有两类主要的接口,即序列化和反序列化;
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
(3)为什么需要序列化和反序列化操作呢?
1、便于存储
序列化过程是将Python程序运行中得到了一些字符串、列表、字典等数据信息转变为二进制数据流。这样信息
就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。
2、便于传输
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的
形式在网络上传送。发送方需要把对象转换为字节序列,在网络上传输;接收方则需要把字节序列在恢复为
对象,得到原始的数据。
import pickle # 调用pickle模块
class MyClass(object): # 定义一个简单的类
school = 'school'
def __init__(self, name):
self.name = name
def choose_course(self):
print('%s正在选课'%self.name)
obj = MyClass('jason') # 产生一个对象
print(obj.school)
obj.choose_course()
with open(r'%s'%obj.name,'wb') as f: # 存入文件
pickle.dump(obj, f)
with open(r'jason','rb') as f: # 获取文件内容
data = pickle.load(f)
print(data) # {'name':'jason'}
print(data.name) # jason
特别注意:pickle产生的文件只有在原来产生对象的类存在时才能正常使用,因此一般获取到的pickle对象保存的数据都是在代码运行时临时存在的,如果没有原来的代码,那么光有这个文件是使用不了里面的对象的