序列化 (Serialization)是将对象的信息转换为可以存储或传输的形式,后续还可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
在python中也可以进行序列化相关的操作,只是序列化的时候需要将对象保存为一个字典的类型。对于Python内置的数据类型(如str, unicode, int, float, bool, None, list, tuple, dict),可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。
实验步骤:
- 将对象序列化为字典
- 读取字典信息并反序列化为对象
- 导入模块
- 找到模块下的某个类
- 通过类名获得类对象,注意:不是类名称,而是类对象
- 通过类对象,实例化一个对象
tmp.py
--------------------------------------------------------------------------------------
class T:
def __init__(self, name, age):
self.name = name
self.age = age
tmp2.py
--------------------------------------------------------------------------------------
# 第一种写法,将对象转化为字典
def obj2dict(obj):
# 定义一个空白的字典,此处没有使用 d={} 方式,因为PyCharm 会产生警告
d = dict()
# 写入模块和类名,用于反射
d['class_name'] = obj.__class__.__name__
d['module_name'] = obj.__module__
# 将对象返回的字典(只包括字段)和类信息连接为一个新的字典
d.update(obj.__dict__)
return d
# 第二种写法,将对象转化为字典
def obj2dict(obj):
new_dict = obj.__dict__
new_dict['class_name'] = obj.__class__.__name__
new_dict['module_name'] = obj.__module__
return new_dict
def dict2obj(dic):
if 'class_name' in dic:
info = "【\n" + "\t接收字典:" + str(dic) + "\n"
# 获取类名称和模块名称,并弹出
class_name = dic.pop('class_name')
module_name = dic.pop('module_name')
info += "\t类名称为:" + str(class_name) + "\n" \
+ "\t模块名称:" + str(module_name) + "\n"
# 导入模块,返回已经导入的“模块对象”
# fromlist代表多级导入(否则只能导入到目录级别)
module_obj = __import__(module_name,
fromlist=["True"])
info += "\t模块对象:" + str(module_obj) + "\n"
# 通过“类名称” 返回 “类对象”
# 第一个参数必需传已经导入的“模块对象”,不能传“模块名称”
class_obj = getattr(module_obj, class_name)
info += "\t类对象为:" + str(class_obj) + "\n" \
+ "\t构造参数:" + str(dic) + "\n" + "】"
print(info)
# 反射实例化一个对象
instance = class_obj(**dic)
else:
instance = dic
return instance
tmp3.py
--------------------------------------------------------------------------------------
from TestTemp.tmp import T
from TestTemp.tmp2 import *
if __name__ == "__main__":
t = T("Jonah", 12)
dic = obj2dict(t) # 对象转字典
ob = dict2obj(dic) # 字典转对象
print(ob)
print(ob.__dict__)
运行结果:
【
接收字典:{'class_name': 'T', 'module_name': 'TestTemp.tmp',
'name': 'Jonah', 'age': 12}
类名称为:T
模块名称:TestTemp.tmp
模块对象:
from 'D:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py'>
类对象为:
构造参数:{'name': 'Jonah', 'age': 12}
】
{'name': 'Jonah', 'age': 12}
尾注:
如果你对软件测试感兴趣,欢迎来访:
关注作者:千锋教育官方博客
更多免费视频教程、学习工具获取方式:
千锋软件测试①群:722498357