1. 源碼分析 注意:以下代碼片段為方便理解已進(jìn)行簡化,只保留了與序列化功能相關(guān)的代碼 序列化的源碼中涉及到了元類的概念,我在這里簡單說明一下:元類(metaclass)是一個(gè)高級概念,用于定義類的創(chuàng)建行為。簡單來說,元類是創(chuàng)建類的類,它決定了類的創(chuàng)建方式和行為。 在 Python 中一切皆為對象,
以下是對Python中序列化功能的源碼分析。在序列化的源碼中,涉及到了元類的概念。元類是一個(gè)高級概念,用于定義類的創(chuàng)建行為。簡單來說,元類是創(chuàng)建類的類,它決定了類的創(chuàng)建方式和行為。在Python中,一切皆為對象,包括類。每個(gè)類都有一個(gè)元類,它定義了如何創(chuàng)建這個(gè)類。通常情況下Python會使用默認(rèn)的元類type來創(chuàng)建類。但是,當(dāng)需要對類的創(chuàng)建過程進(jìn)行自定義時(shí),就可以使用元類。
舉例來說,可以定義一個(gè)自定義的元類Mytype,對類的創(chuàng)建過程進(jìn)行操作。在使用自定義元類時(shí),需要在類的定義中指定metaclass參數(shù)為自定義的元類。
另外,需要注意的是,如果指定了元類metaclass,則其子類默認(rèn)會使用該元類來創(chuàng)建類。
Serializers組件主要有兩個(gè)功能:序列化和數(shù)據(jù)校驗(yàn)。首先,定義一個(gè)序列化類DepartSerializer,其中包含了內(nèi)置校驗(yàn)和字段定義。查看Serializer的父類,可知其是通過SerializerMetaclass元類創(chuàng)建的。SerializerMetaclass元類的作用是為類中增加_declared_fields屬性,其中封裝了所有的Field字段名及對應(yīng)的對象。
在序列化流程中,通過serializer.data觸發(fā)序列化流程。BaseSerializer的data方法源碼中執(zhí)行了to_representation方法獲取序列化數(shù)據(jù)。to_representation方法是序列化的核心,它循環(huán)字段對象列表,并執(zhí)行g(shù)et_attribute方法獲取對應(yīng)的值,然后執(zhí)行to_representation轉(zhuǎn)換格式,并將所有數(shù)據(jù)封裝到ret字典中。
數(shù)據(jù)校驗(yàn)部分使用is_valid方法校驗(yàn)數(shù)據(jù),獲取_errors數(shù)據(jù)。在執(zhí)行該函數(shù)的過程中,觸發(fā)了run_validation方法。run_validation方法是Serializer類下的方法,在to_internal_value方法中調(diào)用字段內(nèi)置校驗(yàn),并執(zhí)行鉤子函數(shù)。
另外,可以自定義鉤子,讓某字段既能支持前端傳入,又能自定義序列化返回的值。在調(diào)用ser.data開始序列化后的to_representation方法中判斷有無自定義格式的鉤子,如果有則替換掉該字段對象的值。如果其他類中也需要使用該重寫方法,可將該重新方法封裝成類,其他類中繼承該類后,即可不用每次都重寫to_representation方法。
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動態(tài)代理的對比分析
閱讀Win11筆記本“自動管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)