设计模式与pickle模块
设计模式
设计模式的定义
设计模式其实就是程序员前辈多次验证过的用语处理固定问题的固定方法。
设计模式
设计模式共有23种。大致可以分为三种类型
- 创建型
- 结构型
- 行为型
设计模式之单例模式
单例模式其实是指一个类只产生一个对象。这样的模式的目的是为了节省内存资源。单例模式可以应用于以下两种情况
- 类中有很多绑定给对象的方法,而且这些方法都比较牛
- 在拿到一个新的类的时候,不确定这个类是否已经产生了对象。如果已经产生过对象的情况下在产生一个新的对象就会造成内存的资源的浪费
单例模式对对象实例化的影响
在对象实例化的过程中完成单例模式的方式有很多种。
基于元类的单例模式
class Myclass(type):
def __call__(self, *args, **kwargs):
if not hasattr(self, 'instance'): # 判断类内有没有名为instance的数据或方法
self.instance = super().__call__(*args, **kwargs) # 没有的时候添加
return self.instance # 有的时候
class Single_Calss(metaclass=Myclass):
def __init__(self, name):
self.name = name
obj1 = Single_Calss('oliver')
obj2 = Single_Calss('kevin')
print(obj1) # <__main__.Single_Calss object at 0x000002A639C6CD30>
print(obj2) # <__main__.Single_Calss object at 0x000002A639C6CD30>
print(obj1.__dict__) # {'name': 'oliver'}
print(obj2.__dict__) # {'name': 'oliver'}
基于classmethod的单例模式
class Myclass(object):
_instance = None
def __init__(self, name, gender):
self.name = name
self.gender = gender
@classmethod
def single(cls):
if not cls._instance: # 判断类名称空间内部是否存在个性数据
cls._instance = Myclass('name', 'gender')
return cls._instance
obj1 = Myclass.single()
obj2 = Myclass.single()
print(obj1) # <__main__.Myclass object at 0x0000025955B9CE10>
print(obj2) # <__main__.Myclass object at 0x0000025955B9CE10>
print(obj1.name) # name
print(obj1.gender) # gender
基于__new__方法的单例模式
class Mysql(object):
_instance = None
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = object.__new__(cls)
return cls._instance
obj = Mysql('egon')
obj1 = Mysql('jason')
print(id(obj), id(obj1))
pickle模块
pickle模块的学习主要是为了教育管理系统的编写,后期ORM学习之后,pickle模块就用不到了。pickle模块是针对python的模块。pickle模块的主要作用就是能够将对象保存到文件里,并且取出之后对象其中的数据与方法还可以使用
import pickle
class Myclass(object):
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def func_name(self):
print('对象里的方法')
obj1 = Myclass('oliver', 25, 'male')
print(obj1.__dict__)
with open(r'%s'% obj1.name, 'w', encoding='utf8') as f:
json.dump(obj1, f) #TypeError: Object of type 'Myclass' is not JSON serializable
with open(r'%s.txt' % obj1.name, 'wb') as f:
pickle.dump(obj1, f)
with open(r'%s.txt' % obj1.name, 'rb') as f:
res = pickle.load(f)
print(res.__dict__) # {'name': 'oliver', 'age': 25, 'gender': 'male'}
res.func_name() # 对象里的方法