序列化 (Serialization)是將對(duì)象的信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问剑罄m(xù)還可以通過從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。
在python中也可以進(jìn)行序列化相關(guān)的操作,只是序列化的時(shí)候需要將對(duì)象保存為一個(gè)字典的類型。對(duì)于Python內(nèi)置的數(shù)據(jù)類型(如str, unicode, int, float, bool, None, list, tuple, dict),可以直接進(jìn)行序列化/反序列化處理;對(duì)于自定義類的對(duì)象進(jìn)行序列化和反序列化時(shí),需要我們自己定義一個(gè)方法來完成定義object和dict之間進(jìn)行轉(zhuǎn)化。
?
?
實(shí)驗(yàn)步驟:
- 將對(duì)象序列化為字典
- 讀取字典信息并反序列化為對(duì)象
- 導(dǎo)入模塊
- 找到模塊下的某個(gè)類
- 通過類名獲得類對(duì)象,注意:不是類名稱,而是類對(duì)象
- 通過類對(duì)象,實(shí)例化一個(gè)對(duì)象
?
?
tmp.py
--------------------------------------------------------------------------------------
class T:
def __init__(self, name, age):
self.name = name
self.age = age
?
?
tmp2.py
--------------------------------------------------------------------------------------
# 第一種寫法,將對(duì)象轉(zhuǎn)化為字典
def obj2dict(obj):
# 定義一個(gè)空白的字典,此處沒有使用?d={} 方式,因?yàn)镻yCharm 會(huì)產(chǎn)生警告
d = dict()
# 寫入模塊和類名,用于反射
d['class_name'] = obj.__class__.__name__
d['module_name'] = obj.__module__
# 將對(duì)象返回的字典(只包括字段)和類信息連接為一個(gè)新的字典
d.update(obj.__dict__)
return d
?
?
# 第二種寫法,將對(duì)象轉(zhuǎn)化為字典
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"
?
# 導(dǎo)入模塊,返回已經(jīng)導(dǎo)入的“模塊對(duì)象”
# fromlist代表多級(jí)導(dǎo)入(否則只能導(dǎo)入到目錄級(jí)別)
module_obj = __import__(module_name,
fromlist=["True"])
info += "\t模塊對(duì)象:" + str(module_obj) + "\n"
?
# 通過“類名稱” 返回 “類對(duì)象”
# 第一個(gè)參數(shù)必需傳已經(jīng)導(dǎo)入的“模塊對(duì)象”,不能傳“模塊名稱”
class_obj = getattr(module_obj, class_name)
info += "\t類對(duì)象為:" + str(class_obj) + "\n" \
+ "\t構(gòu)造參數(shù):" + str(dic) + "\n" + "】"
print(info)
?
# 反射實(shí)例化一個(gè)對(duì)象
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) ?# 對(duì)象轉(zhuǎn)字典
ob = dict2obj(dic) # 字典轉(zhuǎn)對(duì)象
print(ob)
print(ob.__dict__)
?
?
運(yùn)行結(jié)果:
【
接收字典:{'class_name': 'T', 'module_name': 'TestTemp.tmp',
'name': 'Jonah', 'age': 12}
類名稱為:T
模塊名稱:TestTemp.tmp
模塊對(duì)象:
from 'D:\\A00__Dev\\pyprojects\\Stu\\TestTemp\\tmp.py'>
類對(duì)象為:
構(gòu)造參數(shù):{'name': 'Jonah', 'age': 12}
】
?
{'name': 'Jonah', 'age': 12}
?
尾注:
如果你對(duì)軟件測(cè)試感興趣,歡迎來訪:
關(guān)注作者:千鋒教育官方博客
更多免費(fèi)視頻教程、學(xué)習(xí)工具獲取方式:
千鋒軟件測(cè)試①群:722498357
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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