1. 源碼分析 注意:以下代碼片段為方便理解已進(jìn)行簡(jiǎn)化,只保留了與序列化功能相關(guān)的代碼 序列化的源碼中涉及到了元類的概念,我在這里簡(jiǎn)單說明一下:元類(metaclass)是一個(gè)高級(jí)概念,用于定義類的創(chuàng)建行為。簡(jiǎn)單來說,元類是創(chuàng)建類的類,它決定了類的創(chuàng)建方式和行為。 在 Python 中一切皆為對(duì)象,
以下是對(duì)Python中序列化功能的源碼分析。在序列化的源碼中,涉及到了元類的概念。元類是一個(gè)高級(jí)概念,用于定義類的創(chuàng)建行為。簡(jiǎn)單來說,元類是創(chuàng)建類的類,它決定了類的創(chuàng)建方式和行為。在Python中,一切皆為對(duì)象,包括類。每個(gè)類都有一個(gè)元類,它定義了如何創(chuàng)建這個(gè)類。通常情況下Python會(huì)使用默認(rèn)的元類type來創(chuàng)建類。但是,當(dāng)需要對(duì)類的創(chuàng)建過程進(jìn)行自定義時(shí),就可以使用元類。
舉例來說,可以定義一個(gè)自定義的元類Mytype,對(duì)類的創(chuàng)建過程進(jìn)行操作。在使用自定義元類時(shí),需要在類的定義中指定metaclass參數(shù)為自定義的元類。
另外,需要注意的是,如果指定了元類metaclass,則其子類默認(rèn)會(huì)使用該元類來創(chuàng)建類。
Serializers組件主要有兩個(gè)功能:序列化和數(shù)據(jù)校驗(yàn)。首先,定義一個(gè)序列化類DepartSerializer,其中包含了內(nèi)置校驗(yàn)和字段定義。查看Serializer的父類,可知其是通過SerializerMetaclass元類創(chuàng)建的。SerializerMetaclass元類的作用是為類中增加_declared_fields屬性,其中封裝了所有的Field字段名及對(duì)應(yīng)的對(duì)象。
在序列化流程中,通過serializer.data觸發(fā)序列化流程。BaseSerializer的data方法源碼中執(zhí)行了to_representation方法獲取序列化數(shù)據(jù)。to_representation方法是序列化的核心,它循環(huán)字段對(duì)象列表,并執(zhí)行g(shù)et_attribute方法獲取對(duì)應(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方法中判斷有無自定義格式的鉤子,如果有則替換掉該字段對(duì)象的值。如果其他類中也需要使用該重寫方法,可將該重新方法封裝成類,其他類中繼承該類后,即可不用每次都重寫to_representation方法。
小編推薦閱讀golang slice相關(guān)常見的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國產(chǎn)操作系統(tǒng)上實(shí)現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時(shí)相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計(jì)與RuoYi系統(tǒng)的借鑒
閱讀count(*)、count(1)哪個(gè)更快?面試必問:通宵整理的十道經(jīng)典MySQL必問面試題
閱讀從需求分析、產(chǎn)品設(shè)計(jì)到部署交付各階段說明
閱讀如何利用七牛云進(jìn)行數(shù)據(jù)備份和刪除
閱讀強(qiáng)化學(xué)習(xí)筆記之【ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization】
閱讀使用MailKit在.NET Core中收發(fā)郵件的完整示例
閱讀WiFi基礎(chǔ)(六):天線基礎(chǔ)知識(shí)
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)