软件测试学习教程——Python实现反射机制

系统 1366 0

序列化 (Serialization)是将对象的信息转换为可以存储或传输的形式,后续还可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

在python中也可以进行序列化相关的操作,只是序列化的时候需要将对象保存为一个字典的类型。对于Python内置的数据类型(如str, unicode, int, float, bool, None, list, tuple, dict),可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。

 

 

实验步骤:

  1. 将对象序列化为字典
  2. 读取字典信息并反序列化为对象
  1. 导入模块
  2. 找到模块下的某个类
  3. 通过类名获得类对象,注意:不是类名称,而是类对象
  4. 通过类对象,实例化一个对象

 

 

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

 

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论