<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

      Python:描述符協(xié)議

      0
      分享至

      在 Python 面向?qū)ο缶幊讨校悓傩缘脑L問和控制非常靈活。為了支持屬性的動態(tài)訪問、驗證、緩存和代理行為,Python 提供了描述符協(xié)議(Descriptor Protocol),是 Python 中實現(xiàn)訪問控制、延遲加載、ORM 字段、property 裝飾器等機制的核心基礎(chǔ)。

      描述符提供了比傳統(tǒng) getter/setter 更統(tǒng)一、更強大的能力,是 Python 對象模型中最重要的機制之一。理解描述符,能夠讓你真正掌握 Python 的屬性訪問機制。

      一、傳統(tǒng)的 Setter/Getter/Deleter

      假設(shè)我們有一個類 BankAccount,希望控制銀行賬戶余額 _balance 的訪問方式:

              del self._balance

      使用方式:

      # account.set_balance(-50)              # 會拋出 ValueError

      為什么說這是“傳統(tǒng)的”?

      ? 必須顯式調(diào)用 get_x / set_x,不夠 Pythonic。

      ? 無法用自然的屬性語法(obj.attr)。

      ? 冗長、繁瑣,不符合“簡單即美”的 Python 哲學(xué)。

      因此,Python 提供了更高級的方案 —— @property。

      二、Python 的進化:@property 裝飾器

      @property 允許你用屬性語法訪問方法:

              del self._balance

      使用方式:

      del account.balance                # 輸出:Deleting balance!

      我們也可以不使用裝飾器語法,而是顯式創(chuàng)建 property:

          balance = property(get_balance, set_balance, del_balance)

      裝飾器是語法糖,本質(zhì)和顯式寫法等價!

      三、描述符與描述符協(xié)議

      property 不是魔法,它基于描述符協(xié)議(Descriptor Protocol)。

      (1)什么是描述符

      只要一個對象實現(xiàn)了以下任意方法,它就是描述符:

      ? __get__(self, instance, owner)

      ? __set__(self, instance, value)

      ? __delete__(self, instance)

      并且當(dāng)此對象作為類屬性存在時,通過 obj.attr 訪問會自動調(diào)用這些方法。描述符允許我們“鉤住”屬性訪問過程,自定義其行為。

      (2)描述符協(xié)議三方法

      __get__(self, instance, owner)

      讀取屬性時觸發(fā)。

      參數(shù):

      self:描述符實例本身。

      instance:通過實例訪問時為實例,通過類訪問時為 None。

      owner:擁有描述符的類(通過類訪問時)。

      __set__(self, instance, value)

      設(shè)置屬性時觸發(fā)。

      __delete__(self, instance)

      刪除屬性時觸發(fā)。

      所有 property、方法綁定、ORM 字段、cached_property 都基于描述符協(xié)議。

      (3)property 與描述符的關(guān)系

      當(dāng)我們使用 @property 時,本質(zhì)上是在創(chuàng)建一個 property 描述符實例。

      以下是 property 的簡化原理:

              self.fdel(instance)

      property 就是一個實現(xiàn)了完整描述符協(xié)議的類。

      property 默認是“非數(shù)據(jù)描述符”;只有在定義了 fset 或 fdel 時才成為“數(shù)據(jù)描述符”。

      四、數(shù)據(jù)描述符與非數(shù)據(jù)描述符

      Python 將描述符分為兩類,它們的優(yōu)先級不同。

      (1)數(shù)據(jù)描述符(Data Descriptor)

      指的是定義了 __set__ 或 __delete__ 的描述符。

      如:

      ? property(具有 setter 或 deleter)

      ? 自定義描述符實現(xiàn)了 __set__

      ? ORM 字段、typed 屬性驗證描述符

      優(yōu)先級:數(shù)據(jù)描述符優(yōu)先于實例屬性。

      示例:

      print(a.x)   # get   —— 實例屬性不會覆蓋數(shù)據(jù)描述符

      (2)非數(shù)據(jù)描述符(Non-Data Descriptor)

      指的是只實現(xiàn)了 __get__ 的描述符。

      如:

      ? 普通方法(function)

      ? property(無 setter / deleter)

      優(yōu)先級:實例屬性優(yōu)先于非數(shù)據(jù)描述符。

      示例:

      print(a.x)  # 100  —— 實例字典覆蓋了非數(shù)據(jù)描述符

      優(yōu)先級總結(jié):

      數(shù)據(jù)描述符 > 實例屬性 > 非數(shù)據(jù)描述符 > 普通類屬性

      示例:

      print(obj.non_data_desc)       # 輸出: "實例屬性"(實例屬性優(yōu)先)

      五、屬性查找順序

      當(dāng)執(zhí)行 obj.attr 時,Python 實際執(zhí)行(簡化邏輯):

      1、在類(type(obj)) 中查找 attr;如果找到且是數(shù)據(jù)描述符 → 調(diào)用其 __get__ 并返回結(jié)果。

      2、否則查找實例字典 obj.__dict__;如果存在 → 返回該值。

      3、若類屬性是非數(shù)據(jù)描述符 → 調(diào)用其 __get__ 并返回結(jié)果。

      4、否則返回類屬性本身。

      5、若都找不到 → 如果對象實現(xiàn)了 __getattr__ 則調(diào)用它。

      設(shè)置屬性時:

      ? 若存在數(shù)據(jù)描述符 → 調(diào)用其 __set__

      ? 否則寫入實例字典

      刪除屬性時:

      ? 若存在數(shù)據(jù)描述符 → 調(diào)用其 __delete__

      ? 否則從實例字典刪除

      示例:完整的查找規(guī)則演示

      print(demo.class_attr)  # 類屬性

      這種精細的屬性查找順序與描述符優(yōu)先級機制,使得 Python 在實現(xiàn)面向?qū)ο筇匦詴r既靈活又高效。

      六、自定義描述符

      下面構(gòu)造一個完整的年齡驗證描述符,改進 __get__ 的容錯處理,同時演示推薦的實例數(shù)據(jù)存儲方式(使用實例字典并帶上唯一鍵)并加入 __set_name__ 支持以獲取屬性名:

      將其綁定到類屬性:

      使用示例:

      (1)描述符實例是類屬性,不是實例屬性

      描述符對象只創(chuàng)建一次(在類定義時),不應(yīng)該在描述符內(nèi)部用 self.xxx 來存儲每個實例的數(shù)據(jù),否則所有實例會共享同一份數(shù)據(jù)(通常這是錯誤的)。正確做法是將實例數(shù)據(jù)存儲在 instance.__dict__ 或使用 instance 上的獨立鍵(例如 _{name})。

      (2)set_name(推薦)

      自 Python 3.6 起,描述符可以實現(xiàn) __set_name__(self, owner, name),類創(chuàng)建時會被調(diào)用一次,這可以幫助描述符自動記錄它在類中對應(yīng)的屬性名,從而簡化向 instance.__dict__ 中存儲值的實現(xiàn)(見上面示例)。這是實現(xiàn)“按屬性名存儲”“不會沖突”的推薦方式。

      (3)刪除屬性后再訪問

      del p.age 會調(diào)用 __delete__,如果我們在 __get__ 中直接訪問 instance.__dict__ 中的鍵而該鍵不存在,會拋出 AttributeError。在實際實現(xiàn)中可以選擇更友好的行為(例如返回 None、拋出帶信息的異常或觸發(fā)延遲加載)。

      七、描述符的典型應(yīng)用場景

      描述符在 Python 中有廣泛的應(yīng)用。

      (1)數(shù)據(jù)驗證與類型檢查

      (2)延遲加載與緩存機制(如 cached_property)

      (3)觀察者模式與屬性監(jiān)聽

      (4)權(quán)限控制與訪問審計

      (5)ORM 與數(shù)據(jù)映射(字段描述符)

      (6)配置管理與依賴注入

      補充說明:方法如何綁定為 bound method

      Python 中的函數(shù)對象(定義在類體中的函數(shù))實現(xiàn)了 __get__(即函數(shù)對象是非數(shù)據(jù)描述符),當(dāng)通過實例訪問時,function.__get__(instance, owner) 會返回一個“綁定方法”(bound method),它把該實例作為第一個參數(shù)(self)封裝到函數(shù)上。理解這一點有助于把“方法也是描述符”與前面描述符優(yōu)先級的討論連起來。

      小結(jié)

      描述符協(xié)議是 Python 中控制屬性訪問的底層機制。只要一個類實現(xiàn)了 __get__、__set__ 或 __delete__,它就能作為描述符攔截屬性的讀取、寫入和刪除操作。property、方法綁定、ORM 字段以及許多高級特性都依賴描述符協(xié)議。

      理解描述符的關(guān)鍵在于區(qū)分數(shù)據(jù)描述符和非數(shù)據(jù)描述符,并掌握它們在屬性查找順序中的不同優(yōu)先級。__set_name__ 是現(xiàn)代描述符實現(xiàn)中非常有用的鉤子(Python 3.6+),推薦在自定義描述符中使用它來管理實例字典的鍵。

      通過自定義描述符,我們可以構(gòu)建高度可復(fù)用、可擴展的屬性管理邏輯,使得類的行為更加靈活與優(yōu)雅;描述符不僅是 Python 的底層機制,更是構(gòu)建大型系統(tǒng)與框架的基礎(chǔ)組件。


      點贊有美意,贊賞是鼓勵

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點推薦
      太離譜,閑魚驚現(xiàn) iPhone 18 Pro 工程機

      太離譜,閑魚驚現(xiàn) iPhone 18 Pro 工程機

      花果科技
      2026-01-12 12:46:04
      全世界最狠的騙局,莫過于貸款買房。

      全世界最狠的騙局,莫過于貸款買房。

      流蘇晚晴
      2026-01-08 18:18:57
      俄軍怒火被徹底點燃,連夜裝填核彈,美終于怕了,威脅歐盟快收手

      俄軍怒火被徹底點燃,連夜裝填核彈,美終于怕了,威脅歐盟快收手

      妙知
      2026-01-12 13:32:43
      TOP14位身高170以上的女神,有顏有燈有演技

      TOP14位身高170以上的女神,有顏有燈有演技

      素然追光
      2026-01-02 02:45:02
      醫(yī)生發(fā)現(xiàn):天冷堅持戴帽子的人,過不了幾個月,身體會有5大變化

      醫(yī)生發(fā)現(xiàn):天冷堅持戴帽子的人,過不了幾個月,身體會有5大變化

      健康之光
      2026-01-12 11:50:08
      他上賽季還在保級隊效力,如今卻在冬訓(xùn)迎來逆襲,轉(zhuǎn)會蓉城踢首發(fā)

      他上賽季還在保級隊效力,如今卻在冬訓(xùn)迎來逆襲,轉(zhuǎn)會蓉城踢首發(fā)

      振剛說足球
      2026-01-12 13:46:01
      大清朝第一罪人,不是鰲拜,也不是吳三桂,而是當(dāng)了35年忠臣的他

      大清朝第一罪人,不是鰲拜,也不是吳三桂,而是當(dāng)了35年忠臣的他

      豐譚筆錄
      2026-01-12 07:50:12
      周一官宣新帥!曼聯(lián)高層拍板,索肖恐無緣回歸,黑馬脫穎而出

      周一官宣新帥!曼聯(lián)高層拍板,索肖恐無緣回歸,黑馬脫穎而出

      阿泰希特
      2026-01-12 10:02:14
      本周,青島開啟升溫模式,直沖13℃!接下來將迎雨雪天氣→

      本周,青島開啟升溫模式,直沖13℃!接下來將迎雨雪天氣→

      魯中晨報
      2026-01-12 07:17:07
      世體:國米只需付出1500萬歐,馬競便可以放莫利納離隊

      世體:國米只需付出1500萬歐,馬競便可以放莫利納離隊

      懂球帝
      2026-01-12 13:21:07
      中方下“逐客令”,直言:一粒大米也不要,直接叫停900萬噸訂單

      中方下“逐客令”,直言:一粒大米也不要,直接叫停900萬噸訂單

      愛吃醋的貓咪
      2025-12-27 16:24:13
      40歲保姆:拿著雇主的高工資提供特殊服務(wù),老公得知后和我離婚了

      40歲保姆:拿著雇主的高工資提供特殊服務(wù),老公得知后和我離婚了

      孢木情感
      2026-01-11 19:12:55
      歷經(jīng)十幾年談判,5個縣都劃歸鄰國,如今現(xiàn)狀如何了?

      歷經(jīng)十幾年談判,5個縣都劃歸鄰國,如今現(xiàn)狀如何了?

      鶴羽說個事
      2026-01-09 14:29:53
      南海撞機王偉成功跳傘,咋10萬人都找不到他?直到20多年后才明白

      南海撞機王偉成功跳傘,咋10萬人都找不到他?直到20多年后才明白

      鶴羽說個事
      2025-12-12 14:31:49
      離譜!美商務(wù)部長:臺積電必須雇傭跨性別、女同工程師!否則違規(guī)!

      離譜!美商務(wù)部長:臺積電必須雇傭跨性別、女同工程師!否則違規(guī)!

      EETOP半導(dǎo)體社區(qū)
      2026-01-12 11:38:27
      患者憤怒發(fā)聲:醫(yī)生準(zhǔn)時下班,等待無果引熱議!醫(yī)保局力推減少排隊等候

      患者憤怒發(fā)聲:醫(yī)生準(zhǔn)時下班,等待無果引熱議!醫(yī)保局力推減少排隊等候

      寶哥精彩賽事
      2026-01-12 08:25:18
      瑞銀分析師:2030年中國電動汽車或獨占全球市場三分之一份額

      瑞銀分析師:2030年中國電動汽車或獨占全球市場三分之一份額

      IT之家
      2026-01-12 11:13:09
      閆學(xué)晶“哭窮”后多平臺賬號禁止關(guān)注 其代言調(diào)料品牌老總:將向她索賠 不再請明星代言

      閆學(xué)晶“哭窮”后多平臺賬號禁止關(guān)注 其代言調(diào)料品牌老總:將向她索賠 不再請明星代言

      紅星新聞
      2026-01-10 14:19:18
      這個手握全球代碼精華的社區(qū),自殺了。

      這個手握全球代碼精華的社區(qū),自殺了。

      差評XPIN
      2026-01-12 00:08:23
      曝某頭部新勢力將關(guān)店、裁員!

      曝某頭部新勢力將關(guān)店、裁員!

      電動知家
      2026-01-11 13:59:09
      2026-01-12 14:16:49
      MediaTea
      MediaTea
      專業(yè)的數(shù)字媒體、新媒體技術(shù)
      1701文章數(shù) 72關(guān)注度
      往期回顧 全部

      科技要聞

      小米二手車價大跳水:SU7半年跌5萬元

      頭條要聞

      臺媒:大陸在朱日和基地復(fù)制"總統(tǒng)府" 不可掉以輕心

      頭條要聞

      臺媒:大陸在朱日和基地復(fù)制"總統(tǒng)府" 不可掉以輕心

      體育要聞

      聰明的球員,不是教練教出來的

      娛樂要聞

      閆學(xué)晶:脫離群眾太久 忘了自己的根

      財經(jīng)要聞

      揭秘“穩(wěn)賺不賠”的代工項目騙局

      汽車要聞

      增配不加價 北京現(xiàn)代 第五代 勝達2026款上市

      態(tài)度原創(chuàng)

      教育
      時尚
      親子
      游戲
      手機

      教育要聞

      學(xué)霸思維訓(xùn)練:巧求陰影部分的面積

      普通人就該照搬這些穿搭!衣服不用買太貴,自然耐看又舒適

      親子要聞

      謝霆鋒沒想到,一天4餐、愛吃牛排的兩個兒子,成了張柏芝的底氣

      《P5》外網(wǎng)噴爛引發(fā)熱議 無聊透頂被人高估?

      手機要聞

      消息稱泡泡瑪特本月推“潮玩手機”,或與“年輕化主流品牌”合作

      無障礙瀏覽 進入關(guān)懷版 主站蜘蛛池模板: 一区二区三区毛VⅤ| 久久99精品久久久久子伦| 中国大陆高清aⅴ毛片| 亚洲精品字幕| 国产精品人妻在线观看| 久久无码字幕中文久久无码| 免费a级毛片18以上观看精品| 丝袜a∨在线一区二区三区不卡| 免费视频欧美无人区码| 午夜剧场黄色| 桃色91| 口爆吞精一区二区久久| 西西人体大胆瓣开下部自慰| 亚洲av二区伊人久久| 国产在线啪| 无码人妻黑人中文字幕| 乱色熟女综合一区二区三区| 国产精品va在线观看无码不卡| 色色热| 熟女一区二区中文在线| 91精品导航| 东城区| 8X成年视频在线观看| 亚洲av成人精品一区二区三区| 99热线精品大全在线观看| 欧美?日韩?人妻| 亚洲人成网站18禁止| 精品黑人一区二区三区久久| 国产视色精品亚洲一区二区 | 亚洲va中文在线播放免费| 亚洲国产欧美在线人成AAAA| jizz日本版| 梅河口市| 四虎三级在线视频播放| 人妻中文网| 欧美人与性动交ccoo| 国产精自产拍久久久久久蜜| 黑人玩弄人妻中文在线| 色综合网址你懂的| 欧美日韩一线| 日本va欧美va精品发布|