首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

实验步骤:

1.将对象序列化为字典

2.读取字典信息并反序列化为对象

A.导入模块

B.找到模块下的某个类

C.通过类名获得类对象,注意:不是类名称,而是类对象

D.通过类对象,实例化一个对象

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

模块对象:<module'TestTemp.tmp'

from'D:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py'>

类对象为:<class'TestTemp.tmp.T'>

构造参数:{'name':'Jonah','age':12}

<TestTemp.tmp.T object at 0x00000000025EF630>

{'name':'Jonah','age':12}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190909A0BODR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券