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

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

系統 1675 0

序列化 (Serialization)是將對象的信息轉換為可以存儲或傳輸的形式,后續還可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

在python中也可以進行序列化相關的操作,只是序列化的時候需要將對象保存為一個字典的類型。對于Python內置的數據類型(如str, unicode, int, float, bool, None, list, tuple, dict),可以直接進行序列化/反序列化處理;對于自定義類的對象進行序列化和反序列化時,需要我們自己定義一個方法來完成定義object和dict之間進行轉化。

?

?

實驗步驟:

  1. 將對象序列化為字典
  2. 讀取字典信息并反序列化為對象
  1. 導入模塊
  2. 找到模塊下的某個類
  3. 通過類名獲得類對象,注意:不是類名稱,而是類對象
  4. 通過類對象,實例化一個對象

?

?

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 马尔康县| 凌海市| 大丰市| 白银市| 金华市| 广东省| 乌鲁木齐县| 柯坪县| 来宾市| 稻城县| 乐陵市| 安新县| 武山县| 常熟市| 大理市| 河间市| 哈尔滨市| 西充县| 武山县| 肃宁县| 寿阳县| 东阿县| 正阳县| 中宁县| 西贡区| 垫江县| 甘孜| 乌海市| 顺昌县| 临湘市| 凌云县| 邢台县| 兴义市| 商河县| 尼勒克县| 安仁县| 高雄市| 绥阳县| 天长市| 克什克腾旗| 泰安市|