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

博客介绍了序列化是将对象信息转换为可存储或传输形式,后续可反序列化重建对象。在Python中,内置数据类型可直接序列化/反序列化,自定义类对象需自定义方法。还给出了将对象序列化为字典、读取字典反序列化为对象的实验步骤及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

956370c0b07af407e43c4d953b53940c.png

  实验步骤:

  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="【"+"接收字典:"+str(dic)+""

  #获取类名称和模块名称,并弹出

  class_name=dic.pop('class_name')

  module_name=dic.pop('module_name')

  info+="类名称为:"+str(class_name)+""

  +"模块名称:"+str(module_name)+""

  #导入模块,返回已经导入的“模块对象”

  #fromlist代表多级导入(否则只能导入到目录级别)

  module_obj=__import__(module_name,

  fromlist=["True"])

  info+="模块对象:"+str(module_obj)+""

  #通过“类名称”返回“类对象”

  #第一个参数必需传已经导入的“模块对象”,不能传“模块名称”

  class_obj=getattr(module_obj,class_name)

  info+="类对象为:"+str(class_obj)+""

  +"构造参数:"+str(dic)+""+"】"

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值