序列化 (Serialization)是將對象的信息轉換為可以存儲或傳輸的形式,后續還可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
在python中也可以進行序列化相關的操作,只是序列化的時候需要將對象保存為一個字典的類型。對于Python內置的數據類型(如str, unicode, int, float, bool, None, list, tuple, dict),可以直接進行序列化/反序列化處理;對于自定義類的對象進行序列化和反序列化時,需要我們自己定義一個方法來完成定義object和dict之間進行轉化。
?
?
實驗步驟:
- 將對象序列化為字典
- 讀取字典信息并反序列化為對象
- 導入模塊
- 找到模塊下的某個類
- 通過類名獲得類對象,注意:不是類名稱,而是類對象
- 通過類對象,實例化一個對象
?
?
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
模塊對象:
from 'D:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py'>
類對象為:
構造參數:{'name': 'Jonah', 'age': 12}
】
?
{'name': 'Jonah', 'age': 12}
?
尾注:
如果你對軟件測試感興趣,歡迎來訪:
關注作者:千鋒教育官方博客
更多免費視頻教程、學習工具獲取方式:
千鋒軟件測試①群:722498357
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
