ITPub博客

首页 > IT职业 > IT职场 >  软件测试学习教程——Python实现反射机制

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

IT职场 作者:千锋教育官方 时间:2019-09-09 14:54:17 0 删除 编辑

  

  序列化(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}


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69914734/viewspace-2656464/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
千锋IT职业教育——做真实的自己 用良心做教育

注册时间:2019-03-28

  • 博文量
    140
  • 访问量
    92334