軟體測試學習教程——Python實現反射機制

千鋒教育官方發表於2019-09-09

  

  序列化(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部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2656464/,如需轉載,請註明出處,否則將追究法律責任。

相關文章