设计模式之单例模式,pickle模块
#
设计模式#
'''
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
'''
在IT行业中设计模式总共分为23种,可以分为三大类
1.创建型
3.结构型
4.行为型
设计模式之单例模式(23种之一)#
单例模式的意思是一个类只能产生一个对象,用于节省资源
特点:#
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式应用场景:#
# 一个班级只能有一个班主任
# Windows是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以文件的处理必须通过唯一的实例来进行
# 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
'''
优点:
1.在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
2.避免资源的对重占用(比如写文件操作)
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
'''
使用实际说明#
单例模式的意思是一个类只能产生一个对象,用于节省资源
应用场景:
有一个类中有很多非常牛逼的绑定给对象的方法
我们需要在很多地方使用它,那么不同的程序员来用不知道有没有产生对象
所以自己会创建一个新对象,如此往复则会造成资源的浪费
如何实现:
需要在类实例化对象的时候进行干涉 >>>: 元类
单例模式:(可以有很多种编写方式)
使用元类编写单例模式:
'''单例的实现方式不固定 有很多种'''
class Single(type):
def __call__(self, *args, **kwargs):
if not hasattr(self, 'obj'):
self.obj = super().__call__(*args, **kwargs)
return self.obj
class Myclss(metaclass=Single):
def __init__(self, name):
self.name = name
obj1 = Myclss('jason')
obj2 = Myclss('tuzi')
print(id(obj1), id(obj2))
print(obj1, obj2)
pickle模块#
持续化模块:就是让数据持久化保存,可持久化包括自定义在内的各种数据,比较是个python本身复杂数据的存储,但不能跨语言使用
持久化后的字串是不可读的,只能用于python环境,不能于其他语言进行数据交换
'''
模块功能:将对象保存到文件,并且取出来之后还可以使用对象的功能
直接把对象写入到一个二进制的文件里,不现需要先把他们转化为字符串在保存
'''
eg:#
import pickle
class Myclass(object):
school = '翻斗幼儿园'
def __init__(self, name):
self.name = name
def choose_course(self):
print('%s正在选课' % self.name)
obj = Myclass('tuzi')
# print(obj.school)
obj.choose_course()
# 使用pickle来写入文件
with open(f'{obj.name}', 'wb') as f:
pickle.dump(obj, f)
# 使用pickle来读取文件
with open(f'{obj.name}', 'rb') as f:
data = pickle.load(f)
print(data) # <__main__.Myclass object at 0x00000223A7F8C6D8>
print(data.name) # tuzi
print(data.school) # 翻斗幼儿园
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?