Python 屬性描述符(描述符用法建議)

描述符用法建議

下面根據剛剛論述的描述符特征給出一些實用的結論。
使用特性以保持簡單
內置的 property 類創建的其實是覆蓋型描述符,__set__ 方法和
__get__ 方法都實現了,即便不定義設值方法也是如此。特性的
__set__ 方法默認拋出 AttributeError: can’t set attribute,
因此創建只讀屬性最簡單的方式是使用特性,這能避免下一條所述的問
題。

只讀描述符必須有__set__方法
如果使用描述符類實現只讀屬性,要記住,__get____set__
兩個方法必須都定義,否則,實例的同名屬性會遮蓋描述符。只讀屬性
__set__ 方法只需拋出 AttributeError 異常,并提供合適的錯誤
消息。

用于驗證的描述符可以只有 __set__ 方法
對僅用于驗證的描述符來說,__set__ 方法應該檢查 value 參數
獲得的值,如果有效,使用描述符實例的名稱為鍵,直接在實例的
__dict__ 屬性中設置。這樣,從實例中讀取同名屬性的速度很快,因
為不用經過 __get__ 方法處理。參見示例 20-1 中的代碼。

僅有 __get__ 方法的描述符可以實現高效緩存
如果只編寫了 __get__ 方法,那么創建的是非覆蓋型描述符。這
種描述符可用于執行某些耗費資源的計算,然后為實例設置同名屬性,
緩存結果。同名實例屬性會遮蓋描述符,因此后續訪問會直接從實例的__dict__ 屬性中獲取值,而不會再觸發描述符的 __get__ 方法。

非特殊的方法可以被實例屬性遮蓋

由于函數和方法只實現了 __get__ 方法,它們不會處理同名實例
屬性的賦值操作。因此,像 my_obj.the_method = 7 這樣簡單賦值之
后,后續通過該實例訪問 the_method 得到的是數字 7——但是不影響
類或其他實例。然而,特殊方法不受這個問題的影響。解釋器只會在類
中尋找特殊的方法,也就是說,repr(x) 執行的其實是
x.__class__.__repr__(x),因此 x 的__repr__屬性對 repr(x) 方
法調用沒有影響。出于同樣的原因,實例的 __getattr__ 屬性不會破
壞常規的屬性訪問規則。

實例的非特殊方法可以被輕松地覆蓋,這聽起來不可靠且容易出錯,可
是在我使用 Python 的 15 年中從未受此困擾。然而,如果要創建大量動
態屬性,屬性名稱從不受自己控制的數據中獲取(像本章前面那樣),
那么你應該知道這種行為;或許你還可以實現某種機制,過濾或轉義動
態屬性的名稱,以維持數據的健全性。

示例 19-6 中的 FrozenJSON 類不會出現實例屬性遮蓋方法的
問題,因為那個類只有幾個特殊方法和一個 build 類方法。只要
通過類訪問,類方法就是安全的,在示例 19-6 中我就是這么調用
FrozenJSON.build 方法的——在示例 19-7 中替換成 __new__
法了。Record 類(見示例 19-9 和示例 19-11)及其子類也是安全
的,因為只用到了特殊的方法、類方法、靜態方法和特性。特性是
數據描述符,因此不能被實例屬性覆蓋。

討論特性時講了兩個功能,這里討論的描述符還未涉及,結束本章之前
我們來講講:文檔和對刪除托管屬性的處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92402.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92402.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92402.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Milvus 向量數據庫內存使用相關了解

1、支持 MMap 的數據存儲在 Milvus 中,內存映射文件允許將文件內容直接映射到內存中。這一功能提高了內存效率,尤其是在可用內存稀缺但完全加載數據不可行的情況下。這種優化機制可以增加數據容量,同時在一定限度內確保性能;但當數…

C++編程之旅-- -- --默認成員函數(全詳解)

目錄前言構造函數構造函數形式:構造函數的特性:explicit關鍵字析構函數析構函數的概念析構函數的特性含有類類型的成員變量的類析構函數的調用拷貝構造函數拷貝構造函數的概念拷貝構造函數的特性淺拷貝和深拷貝:拷貝構造函數典型調用場景&…

Linux網絡編程:TCP的遠程多線程命令執行

目錄 前言: 一、前文補充 二、服務端的修改 三、Command類的新增 前言: 好久不見,最近忙于其他事情,就耽誤了咱們的Linux的網絡部分的學習。 今天咱們先來給之前所學的TCP的部分進行一個首尾工作,主要是給大家介紹…

重學React(三):狀態管理

背景: 繼續跟著官網的流程往后學,之前已經整理了描述UI以及添加交互兩個模塊,總體來說還是收獲不小的,至少我一個表面上用了四五年React的前端小卡拉米對React的使用都有了新的認知。接下來就到了狀態管理(React特地加…

java web項目入門了解

目錄一、項目流程1. 使用servle2. 使用框架二、了解java web項目構造1. 項目目錄結構2. 查看頁面訪問順序3. 發起請求:jqueryajax4. 接受參數5. JSONJSON 數組三、get和post請求區別一、項目流程 1. 使用servle 有客戶端和服務端,客戶端和服務端進行交…

網絡資源模板--基于Android Studio 實現的日記本App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情(部分) 創建修改頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也可…

GO的啟動流程(GMP模型/內存)

目錄第一部分:程序編譯第二部分:函數解讀1)Golang 核心初始化過程2)創建第一個協程3)啟動系統調度4)跳轉main函數5)總結第三部分:GMP模型Goroutine流程解讀第四部分:內存…

OLTP與OLAP:實時處理與深度分析的較量

OLTP(Online Transaction Processing)定義:OLTP 系統主要用于管理事務性應用程序的數據。這類系統需要支持大量的短時、快速的交互式事務,比如銀行交易、在線購物訂單等。特點:實時處理:OLTP 系統要求對數據…

數據安全與隱私保護:企業級防護策略與技術實現

引言:數據安全的新時代挑戰在數字化轉型加速的今天,數據已成為企業最核心的資產。然而,數據泄露事件頻發,據 IBM《2024 年數據泄露成本報告》顯示,全球數據泄露平均成本已達445 萬美元,較 2020 年增長了 15…

AI_RAG

一.為什么需要RAG(AI幻覺)大模型LLM在某些情況下給出的回答很可能錯誤的,涉及虛構甚至是故意欺騙的信息。二.什么是RAGRAG是一種結合“信息檢索”和“文本生成”的技術,旨在提升生成式AI模型的準確性和可靠性。它通過以下兩個核心…

LeetCode111~130題解

LeetCode111.二叉樹的最小深度: 題目描述: 給定一個二叉樹,找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明:葉子節點是指沒有子節點的節點。 示例 1: 輸入:root …

n8n飛書webhook配置(飛書機器人、飛書bot、feishu bot)Crypto節點、js timestamp代碼、Crypto node

自定義機器人使用指南 利用 n8n 打造飛書 RSS 推送機器人 文章目錄自定義機器人使用指南注意事項功能介紹在群組中添加自定義機器人操作步驟邀請自定義機器人進群。- 進入目標群組,在群組右上角點擊更多按鈕,并點擊 設置。- 在右側 設置 界面&#xff0…

nhdeep檔案管理工具軟件官網

歡迎訪問nhdeep官網: www.nhdeep.com NHDEEP提供一系列專業的單機版檔案管理工具,滿足不同場景下的檔案管理需求,無需網絡連接,數據安全可靠。所有工具均提供免費試用版下載。 檔案綜合管理系統單機版:全面的檔案管理解決方案&a…

RocketMQ節點部署計算方案

節點計算公式 業務場景 預期峰值TPS:200,000 單組容量:40K TPS 容災要求:同城雙機房 nameServer節點數max(3, (15/50) 1) max(3, 0.3 1) max(3, 1.3) 3 Broker節點數ceil(200,000 / 40,000) 5組 總節點數 NameServer節點Broker組數(Mas…

MyBatis聯合查詢 - XML篇

文章目錄數據庫設計MyBatis 配置MyBatis 映射文件Mapper 接口總結數據庫設計 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

Kubelet 探針如何選擇 IP:status.PodIP 溯源與“同 Pod 兩個 IP“現象解析

背景與現象同一個 Pod 的 readiness 和 liveness 探針日志顯示連接的 IP 不一致(例如 10.10.6.10:9999 與 10.10.6.32:9999)。本文從 kubelet 源碼入手,解釋探針目標 IP 的來源、為何會出現兩個不同 IP,并給出建議與驗證方法。在如…

Arm Development Studio 安全通告:CVE-2025-7427

安全之安全(security)博客目錄導讀 目錄 一、概述 二、CVE 詳情 三、受影響產品 四、建議 五、致謝 六、版本歷史 一、概述 ARM已知悉一個影響 Arm Development Studio 的安全漏洞,該漏洞可能允許攻擊者執行 DLL 劫持攻擊(DLL hijacking attack&…

C#異步編程雙利器:異步Lambda與BackgroundWorker實戰解析

**摘要:**深入剖析兩種異步編程范式,解決GUI線程阻塞難題 一、異步Lambda表達式:事件處理的輕量化利器 核心價值:簡化事件響應中的異步操作,避免UI線程阻塞 ? 典型應用場景(WPF示例)&#xff1…

yolo world (1): 論文解讀

YOLO 系列檢測器以其高效性和實用性而聞名。然而,它們依賴于預定義和訓練的目標類別,這限制了其在開放場景中的適用性。為了解決這一限制,我們提出了 YOLO-World,這是一種創新的方法,通過視覺-語言建模和大規模數據集預訓練,增強了 YOLO 的開放詞匯檢測能力。具體來說,我…

【JVM】深入解析Java虛擬機

目錄 1. 區分JDK,JRE 和 JVM 1.1 JVM 1.2 JRE 1.3 JDK 1.4 關系總結 2. 跨平臺性 3. JVM中的內存劃分 4. JVM的類加載機制 5. 雙親委派模型 6. 垃圾回收機制(GC) 6.1 識別垃圾 6.1.1 單個引用 6.1.2 多個引用 6.2 釋放垃圾 6.…