<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
      網易首頁 > 網易號 > 正文 申請入駐

      Python:描述符對象

      0
      分享至

      在 Python 的對象模型中,描述符對象(Descriptor Objects)是支撐語言動態特性的核心機制之一。從最基礎的屬性訪問,到復雜的元編程框架(如 Django ORM、SQLAlchemy、Pydantic 的字段系統),描述符始終處于幕后,卻決定著屬性系統的最終行為。

      如果說 __dict__ 體系提供了屬性數據的靜態存儲結構,那么描述符對象就是介入這一結構之上的動態訪問控制層。

      需要強調的是,描述符不是特殊語法或內建魔法,而是完全遵循 Python 對象模型的普通對象。

      一、描述符對象的概念

      (1)描述符是對象

      在 Python 中,一切皆對象。描述符也不例外:

      ? 它是某個類的實例

      ? 擁有自身的類型、屬性與方法

      ? 可以被賦值、傳遞并存儲于 __dict__ 中

      d = Descriptor()

      在這一層面上,d 與任何普通對象并無區別。

      (2)描述符語義的由來

      描述符之所以獲得特殊語義,并非源于其“身份”,而在于其實現了特定的協議方法,并且位于類屬性位置。

      當一個對象同時滿足以下條件時,在屬性訪問過程中,就會被解釋器識別為描述符對象:

      ? 實現 __get__()、__set__()、__delete__() 中至少一個

      ? 作為類屬性存在于另一個類的 __dict__ 中

      二、描述符的存儲位置與作用范圍

      (1)描述符的存儲位置

      描述符對象在參與屬性訪問控制時,必須作為類屬性存在于另一個類對象的 __dict__ 中。

          x = D()   # 描述符對象存放在 A.__dict__ 中

      此處的 D() 是一個普通對象,但由于它位于 A.__dict__ 中,因此進入屬性查找鏈。

      (2)描述符的作用對象

      盡管描述符存在于類級別,但其控制的卻是:

      ? 實例屬性的訪問

      ? 類屬性的訪問行為(當 instance is None)

      比如:

      print(a.x)    # 輸出:descriptor

      因為該訪問會被解釋為:

      A.__dict__['x'].__get__(a, A)

      從語言規范角度看,描述符對象本質上是對的實現。這些協議方法不是“魔法”,而是 Python 在屬性查找過程中主動調用的標準接口。

      三、描述符對象的分類

      根據是否攔截屬性寫入或刪除操作,描述符可分為兩類:數據描述符(Data Descriptor)和非數據描述符(Non-data Descriptor)。

      (1)數據描述符

      定義:實現了 __set__() 和 / 或 __delete__(),通常同時實現了 __get__() 方法。

      行為特征:在屬性查找順序中優先級高于實例 __dict__,因此實例無法通過同名屬性繞過其控制。

      示例:

              obj.__dict__[self.storage_name] = value

      作為類屬性使用:

          balance = Positive()

      訪問行為驗證:

      print(a.__dict__) # 輸出 {'_balance': 100, 'balance': -999}

      在 Python 的世界里,沒有什么能完全阻止一個想要直接操作 __dict__ 的開發者,但描述符能確保通過“正規途徑”(即 a.balance = val)進入的數據一定是合法的。真正的保護應將存儲名(如 _balance)與屬性名(balance)分離。

      (2)非數據描述符

      定義:僅實現 __get__() 方法。

      行為特征:優先級低于實例 __dict__,因此可被實例屬性遮蔽。

      示例:

              return value

      作為類屬性使用:

              return 42

      訪問行為驗證:

      print(d.value)   # 第二次:直接從 d.__dict__ 取值,42,不再觸發描述符

      以上示例利用非數據描述符優先級低于實例 __dict__ 的特性實現“惰性求值”:首次訪問時觸發計算并將結果緩存至實例 __dict__ ;后續訪問則因實例屬性“遮蔽”了描述符而直接讀取緩存,從而有效避免重復計算,優化運行性能。

      四、Python 內置的描述符對象

      Python 中的大量核心對象,本身就是描述符對象。

      (1)函數對象:非數據描述符

      類中定義的函數對象本身是非數據描述符。通過其 __get__() 方法,Python 實現了實例方法的自動綁定。

      a = A()

      當訪問方法 foo:

      a.foo

      本質是:

      A.__dict__['foo'].__get__(a, A)

      從而生成綁定方法(Bound Method)。

      (2)@property:標準數據描述符

      @property 返回的是標準的數據描述符對象(實現了 __get__()、__set__() 和 __delete__()),用于將屬性訪問映射為函數調用。

      示例:

              self._age = value

      訪問行為:

      p.age = 30       # 調用 property.__set__

      可以這樣說,@property 是描述符機制的官方封裝版本。

      (3)@classmethod 與 @staticmethod

      這兩個裝飾器均返回描述符對象,分別實現對類對象或函數本身的不同綁定策略。

      示例:

              return "no binding"

      訪問驗證:

      print(Demo().static_method()) # 仍不綁定

      classmethod 的描述符在 __get__() 中綁定 owner。staticmethod 的描述符在 __get__() 中直接返回函數。二者都是描述符對象,只是綁定策略不同。

      五、描述符對象在屬性查找鏈中的位置

      當執行 obj.attr 時,Python 的查找順序為:

      1、類 __dict__ 中的數據描述符

      2、實例 obj.__dict__

      3、類 __dict__ 中的非數據描述符

      4、類 __dict__ 中的普通屬性

      5、__getattr__() 方法

      描述符的“權力”并非絕對,而是由協議與順序共同決定的。

      六、描述符的現代最佳實踐:__set_name__

      Python 3.6 之后,引入了:

      __set_name__(self, owner, name)

      __set_name__() 方法在類創建階段被自動調用,使描述符對象能夠獲知自身的屬性名與所屬類。這是當前描述符實現的標準范式。

      示例:

              setattr(obj, self.storage_name, value)

      描述符作為類屬性使用:

          salary = Typed()

      此時在類創建過程中,解釋器會隱式執行:

      Typed.__set_name__(Employee, "salary")

      實際訪問行為如下:

      print(e.salary)   # 輸出:8000

      底層狀態:

      e.__dict__ == {"_age": 30, "_salary": 8000}

      實際數據存儲在實例的 __dict__ 中,而訪問路徑始終經過類 __dict__ 中的描述符對象。

      上例說明:

      ? Typed() 本身是一個普通對象。

      ? 它存在于 Employee.__dict__。

      ? 通過 __set_name__ 獲得屬性名。

      ? 通過 __get__ / __set__ 管理實例數據。

      ? 實例并不直接暴露真實存儲字段。

      這一結構正是現代描述符實現的標準范式,也是 ORM、字段系統、類型系統中最常見的設計基礎。


      小結

      描述符對象是 Python 屬性系統中的關鍵組成部分。它們以普通對象的形式存在于類 __dict__ 中,通過實現特定協議方法參與屬性查找過程,從而實現對屬性訪問行為的精細控制。理解描述符,有助于全面把握 Python 對象模型與屬性機制的設計思想。


      點贊有美意,贊賞是鼓勵

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

      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.

      相關推薦
      熱點推薦
      太離譜,閑魚驚現 iPhone 18 Pro 工程機

      太離譜,閑魚驚現 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
      醫生發現:天冷堅持戴帽子的人,過不了幾個月,身體會有5大變化

      醫生發現:天冷堅持戴帽子的人,過不了幾個月,身體會有5大變化

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

      他上賽季還在保級隊效力,如今卻在冬訓迎來逆襲,轉會蓉城踢首發

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

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

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

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

      阿泰希特
      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歲保姆:拿著雇主的高工資提供特殊服務,老公得知后和我離婚了

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

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

      歷經十幾年談判,5個縣都劃歸鄰國,如今現狀如何了?

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

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

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

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

      EETOP半導體社區
      2026-01-12 11:38:27
      患者憤怒發聲:醫生準時下班,等待無果引熱議!醫保局力推減少排隊等候

      患者憤怒發聲:醫生準時下班,等待無果引熱議!醫保局力推減少排隊等候

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

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

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

      閆學晶“哭窮”后多平臺賬號禁止關注 其代言調料品牌老總:將向她索賠 不再請明星代言

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

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

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

      曝某頭部新勢力將關店、裁員!

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

      科技要聞

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

      頭條要聞

      臺媒:大陸在朱日和基地復制"總統府" 不可掉以輕心

      頭條要聞

      臺媒:大陸在朱日和基地復制"總統府" 不可掉以輕心

      體育要聞

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

      娛樂要聞

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

      財經要聞

      揭秘“穩賺不賠”的代工項目騙局

      汽車要聞

      增配不加價 北京現代 第五代 勝達2026款上市

      態度原創

      教育
      手機
      本地
      藝術
      公開課

      教育要聞

      學霸思維訓練:巧求陰影部分的面積

      手機要聞

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

      本地新聞

      云游內蒙|“包”你再來?一座在硬核里釀出詩意的城

      藝術要聞

      畫完這組畫,他抑郁了,后來自殺了

      公開課

      李玫瑾:為什么性格比能力更重要?

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 中国av网| 亚洲3p| 亚洲国产一区二区三区| 国产内射一区二区三区| 国产成人a人亚洲精品无码| a级毛片在线免费| 久久人爽人人爽人人片av| 成人视频AAA| 亚洲最新无码中文字幕久久| 岛国一级| 天天摸夜夜添| 蜜桃在线视频| 天天躁夜夜躁狠狠综合2020| 国产av一区二区午夜福利| 国产成人精品日本亚洲第一区 | 国产精品毛片无遮挡高清| 拳交av| 久久精品欧美日韩精品| 鹤岗到萝北公交车29路时刻表| 天天躁日日躁夜夜爽| 亚洲一二三| 精品无码人妻一区二区三区三州| 国产99久久亚洲综合精品西瓜tv| 国产成人精品三级在线影中文| 久久一本人碰碰人碰| 亚洲精品久综合蜜| 人妻精品国产一区二区| 久久精品少妇高潮a片免费观| 精品无码久久久久久国产| 永久免费AV无码网站大全| 久久久久高潮毛片免费全部播放 | 人妻熟女欲求不满在线 | 扎鲁特旗| 天美麻花果冻视频大全英文版| 亚洲av中文| 国产精品国色综合久久| 线在女熟产国| 亚洲伊人影院| 熟女福利导航| 成人区人妻精品一区二| 久久av高潮av|