软件测试学习教程——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):

  ifclass_namein 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

  模块对象:<moduleTestTemp.tmp

  fromD:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py>

  类对象为:<classTestTemp.tmp.T>

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

  】

  <TestTemp.tmp.T object at 0xEF630>

  {name:Jonah,age:12}