Python面向对象之设计模式、pickle模块
设计模式
设计模式即前辈们发明的、经过反复验证用于解决固定问题的固定套路
设计模式的类型
在IT行业中设计模式总共有23种,可以分为三大类
- 创建型
- 结构型
- 行为型
单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
# 类加括号调用多次只允许产生一个对象
>>> class MyClass:
... pass
...
>>>
>>> obj1 = MyClass()
>>> obj2 = MyClass()
>>> obj3 = MyClass()
>>> print(id(obj1), id(obj2), id(obj3))
2142505501840 2142504564480 2142505501744
"""正常情况下 类名只要加括号实例化产生对象 执行几次就会产生几个不同的对象"""
若不希望类频繁的产生不同的对象,多个地方需要使用,为节省空间,我们可以使用单例
'''使用元类干预对象的创建过程'''
>>> class MyMeTaClass(type):
... # 记录类是否已经创建了对象
... instance = None
... def __call__(self, *args, **kwargs):
... if self.instance:
... return self.instance
... # 获取空对象
... obj = super().__call__(*args, **kwargs)
... # 保存对象
... self.instance = obj
... # 返回空对象
... return obj
...
>>>
>>> class Single(metaclass=MyMeTaClass):
... def __init__(self, name):
... self.name = name
...
>>>
>>> obj1 = Single('jason')
>>> obj2 = Single('kevin')
>>> obj3 = Single('tony')
>>> print(id(obj1), id(obj2), id(obj3))
2142508386912 2142508386912 2142508386912
>>> print(obj1.name)
jason
>>> print(obj2.name)
jason
>>> print(obj3.name)
jason
pickle模块
pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用 import 将其导入到程序中,就可以直接使用。
主要方法
| 函数 | 描述 |
|---|---|
| dumps() | 将 Python 中的对象序列化成二进制对象,并返回 |
| loads() | 读取给定的二进制对象数据,并将其转换为 Python 对象 |
| dump() | 将 Python 中的对象序列化成二进制对象,并写入文件 |
| load() | 读取指定的序列化数据文件,并返回对象 |
- dumps 和 loads 实现基于内存的 Python 对象与二进制互转
- dump 和 load 实现基于文件的 Python 对象与二进制互转
与 json 模块的区别
pickle 模块与 json 模块很像,都是用来做序列化,反序列化的
并且pickle模块支持python所有数据类型。
区别
- json 是一个文本序列化格式,而 pickle 是一个二进制序列化格式
- json 是我们可以直观阅读的,而 pickle 不可以
- json 是可互操作的,在 Python 系统之外广泛使用,而 pickle 则是 Python 专用的
- 默认情况下,json 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型。
使用(例)
import pickle
class MyClass:
def __init__(self, name):
self.name = name
def choice_course(self):
print('%s正在选课' % self.name)
obj = MyClass('jason')
# 需求:将对象保存到文件 并且将来取出之后*还可以通过句点符随意调用
# with open(r'35.txt','w',encoding='utf8') as f:
# f.write(obj) # 报错,常规的文件操作不行
# import json
# with open(r'35.txt','w',encoding='utf8') as f:
# f.write(json.dumps(obj)) # 报错,json模块也不行
with open(r'35.txt', 'wb') as f:
f.write(pickle.dumps(obj)) # 可以写入,二进制模式 ��. �__main__��MyClass���)��}��name��jason�sb.
# pickle.dump(obj, f) # 两种写入方法
with open(r'35.txt', 'rb') as f:
data = pickle.load(f)
print(data) # <__main__.MyClass object at 0x0000025C6A0DBF70>
print(data.name) # jason
data.choice_course() # jason正在选课
作业
描述选课系统管理员注册功能完整逻辑:
功能展示层(admin_view.py)
-
获取管理员数据(用户名、密码)
-
调用接口,传值
-
接收返回值,打印管理员注册功能反馈信息
核心逻辑层(admin_interface.py)
-
调用数据处理层的方法,判断用户对象是否存在、传入数据保存对象
-
返回信息
数据处理层(db_hanlder.py、 model.py)
-
接收传过来的数据
-
创建对象,调用db_handler.py中相应的功能方法(查找是否存在),将对象传入db_handler.py,判断用户是否存在
-
若不存在,则调用db_handler.py中相应的功能方法(存用户数据),将对象传入db_handler.py,保存用户对象数据
-
返回该对象(若用户存在则返回空)

浙公网安备 33010602011771号