今日目标
- 了解设计模式,按照自己的能力去掌握。
文章目录
学习内容
-
设计模式之单例模式
-
pickle模块
一、设计模式之单例模式
1.什么是单例模式
单例模式是一种经常使用的设计模式,使用该模式创建的类对象在整个系统中只有一个。在python中,使用id(实例名)可以看到多次创建该类的对象的id是相同的
2.什么时候适合使用单例模式
简而言之一句话,需要节省内存,加快对象访问速度以及对象需要被公用的场合
1.系统中配置文件的管理
2.应用程序的日志应用
3.python中单例模式的实现
-
通过模块实现单例模式(最简单的实现方式)
原理:python的模块其实是一个非常好的自带单例模式,python的模块在导入时会生成.pyc文件,在后面再次导入该模块时,会加载.pyc文件
class Singleton(object): pass s = Singleton()
上述文件中就存在了一个Singleton类的实例s,在使用时,通过from singleton import s导入这个实例,就可以获得这个使用这个单例,同时它也是一个单例模式的对象
-
通过改写__new__方法实现(推荐使用该方法)
原理:在python的类创建对象的过程中,先通过__new__方法实例化一个对象(PS:在没有自己定义该方法时会默认调用object.new),然后才执行__init__方法对实例化的对象进行各项初始化复制操作。
-
基于指定metaclass实现
原理:这个解释起来源远流长,可以针对元类单独写一篇博客了,这里就简单说明一下。类其实也是一个对象,创建类的类就是元类,大致可以理解为:MyClass = MetaClass(),MyObject = MyClass(),其中MetaClass就是一个元类,是创建MyClass这个实例(对于MyObject来说它又是一个类,注意区别理解)的类。在python中默认的元类是一个强大的函数type。
class Single(type): new_obj = None def __call__(self, *args, **kwargs): if not self.new_obj: obj = super().__call__(*args, **kwargs) self.new_obj = 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(id(obj1), id(obj2)) print(obj1.__dict__, obj2.__dict__) ''' # 执行结果 2093212036832 2093212036832 {'name': 'jason'} {'name': 'jason'} '''
-
使用装饰器
def log(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return log @log def f(): pass
-
使用类
原理:使用类成员,类成员是该类所有实例共有的属性
二、pickle模块
1.什么是pickle模块
pickle模块使用的数据格式是python专用的,能够把Python对象直接保存到文件,而不须要把他们转化为字符串,也不用底层的文件访问操作把它们写入到一个二进制文件中。
2.Pickle模块中最常用的函数
-
pickle.dump(obj, file, [,protocol])
函数的功能:接受一个文件句柄和一个数据对象作为參数,把数据对象obj以特定的格式保存到给定的文件file里。import pickle l1=[1,2,3,4,5] t1=(1,2,3,4,5) dic1={"k1":"v1","k2":"v2","k3":"v3"} #把列表l1序列化进一个文件f1中 with open("f1","wb") as f: pickle.dump(l1,f) pickle.dump(t1,f) pickle.dump(dic1,f) 序列化后在当前目录下生成一个f1文件,打开文件f1可以看到一堆乱码,如下所示: €]q (KKKKKe.€(KKKKKtq .€}q (X k1qX v1qX k2qX v2qX k3qX v3qu.
-
pickle.load(file)
函数的功能:将file中的对象序列化读出。import pickle #序列化到文件 obj = 123, "abcdedf", ["ac", 123], {"key": "value", "key1": "value1"} print(obj) #wb 读写到二进制文件 f = open("./a.txt",'wb') pickle.dump(obj,f) f.close() f = open("./a.txt",'rb') print(pickle.load(f)) f.close()
-
pickle.dumps(obj[, protocol])
函数的功能:将obj对象序列化为string形式,而不是存入文件中。import pickle ls = ['12', '34', '56'] # dumps 将数据通过特殊的形式转换为只有python语言认识的字符串 str = pickle.dumps(ls) print(str)
-
pickle.loads(string)
函数的功能:从string中读出序列化前的obj对象。import pickle # loads 将pickle数据转换为python的数据结构 ls = ['12', '34', '56'] str = pickle.dumps(ls) mes = pickle.loads(str) print(mes) ['aa', 'bb', 'cc']
总结
- 设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,所以自己在之后可以去学习其他22种模式,尽量去理解一些解决问题的思维逻辑
- 了解Pickle模块用法