日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

軟件測(cè)試學(xué)習(xí)教程——Python實(shí)現(xiàn)反射機(jī)制

系統(tǒng) 1692 0

序列化 (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)步驟:

  1. 將對(duì)象序列化為字典
  2. 讀取字典信息并反序列化為對(duì)象
  1. 導(dǎo)入模塊
  2. 找到模塊下的某個(gè)類
  3. 通過類名獲得類對(duì)象,注意:不是類名稱,而是類對(duì)象
  4. 通過類對(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 喀喇| 宜昌市| 嘉黎县| 武胜县| 定安县| 沈阳市| 池州市| 阳信县| 肃北| 家居| 舟山市| 伊川县| 红河县| 夏津县| 井陉县| 正镶白旗| 五寨县| 恩施市| 商都县| 葵青区| 宣恩县| 永兴县| 土默特左旗| 双城市| 忻城县| 南皮县| 丹寨县| 武强县| 霍州市| 浑源县| 温泉县| 长春市| 洮南市| 调兵山市| 阿鲁科尔沁旗| 务川| 卓尼县| 临洮县| 长汀县| 蛟河市| 施秉县|