python __getattribute__、__getattr__、__setattr__詳解

来源:https://www.cnblogs.com/sheshouxin/archive/2019/02/28/10448056.html
-Advertisement-
Play Games

__getattribute__ 官方文檔中描述如下: 該方法可以攔截對對象屬性的所有訪問企圖,當屬性被訪問時,自動調用該方法(只適用於新式類)。因此常用於實現一些訪問某屬性時執行一段代碼的特性。 需要註意的是,正式由於它攔截對所有屬性的訪問(包括對__dict__的訪問),在使用中要十分小心地避開 ...


__getattribute__

官方文檔中描述如下:

該方法可以攔截對對象屬性的所有訪問企圖,當屬性被訪問時,自動調用該方法(只適用於新式類)。因此常用於實現一些訪問某屬性時執行一段代碼的特性。

需要註意的是,正式由於它攔截對所有屬性的訪問(包括對__dict__的訪問),在使用中要十分小心地避開無限迴圈的陷阱。在__getattribute__方法中訪問當前實例的屬性時,唯一安全的方式是使用基類(超類) 的方法__getattribute__(使用super)。例如:

通過上圖中的代碼示例可以看出,一旦實現了__getattribute__方法,所有通過對象訪問的屬性(包括類屬性)都會被攔截,而直接通過類訪問類屬性則不會。

註意:當訪問的屬性不存在並重載(覆蓋基類對某方法的預設實現)了__getattribute__方法時,該方法不會主動拋出AttributeError異常。上圖中捕獲的AttributeError異常,是由基類__getattribute__方法實現並拋出。

常見的錯誤用法示例:

在實現__getattribute__方法時訪問對象自身的屬性,程式陷入無限迴圈直到崩潰。

__getattr__

官方文檔描述如下:

__getattr__方法的自動執行,需要滿足兩個條件:一是訪問對象屬性;二是觸發AttributeError異常。代碼示例如下:

上圖中,調用不存在的job屬性首先調用__getattribute__方法(如果該方法未定義,會調用基類的__getattribute__方法),觸發AttributeError異常並自動捕獲,然後才調用__getattr__方法。

錯誤用法示例如下:

重載了__getattribute__方法,卻沒有主動拋出AttributeError異常的機制,或者拋出一個其它類型的異常,__getattr__方法都不會執行。

__setattr__

試圖給屬性賦值時自動調用該方法,例如:

之所以會執行三次print函數,是因為在__init__方法中,對象A初始化時給屬性name和age賦值時,觸發了__setattr__方法。使用該方法是同樣需要十分小心避免無限迴圈陷阱。

錯誤用法示例如下:

可以看出,在__setattr__方法中,不能直接給屬性賦值,而通常的做法是使用__dict__魔法屬性。__dict__屬性是一個字典,所有的實例屬性都存儲在這個字典中,而修改__dict__字典中的鍵值對成員不會觸發__setattr__方法,這裡應註意與直接修改__dict__的值的區別。

註意:如果定義__setattr__方法的同時定義了__getattribute__方法,那麼在修改__dict__字典中的鍵值對時,由於調用了self.__dict__屬性,同樣會觸發__getattribute__方法,使用時應格外小心。代碼示例如下:

上圖示例代碼中,每調用一次__setattr__就會調用一次__setattribute__。

註意賦值語句與屬性調用的區別:self.__dict__ = {}是賦值語句,不會觸發__getattribute__方法,但觸發__setattr__方法;self.__dict__[name] = value語句,先調用self.__dict__屬性,得到dict對象後再修改其成員。 

以上。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 移動APP開發框架盤點 總體概述 現在比較流行的移動APP開發框架有以下六種:網頁、混合、漸進、原生、橋接、自繪。前三種體驗與Web的體驗相似,後三種與原生APP的體驗相似。這六種框架形式,都有自己適用的範圍。無所謂好壞,適用就是好。 l 網頁應用適用於傳統網站APP化,比如淘寶、京東,有大量WEB ...
  • 不知不覺已經工作很久了。 從在校參加軟體設計大賽第一次寫項目代碼,到現在已經6年7個月了。 從一開始不知道如何就業,到第一次軟體設計大賽後,決定寫代碼為生。 從在校實習工作的不順心,到明白技術的重要性。事實證明3個月的實習,給我後來的工作也帶來不少幫助。 後來去實習,大四一整年都在企業內度過。當時交 ...
  • 在上一篇中講解Eureka註冊中心的案例,我們啟動了一個user-service,然後通過DiscoveryClient來獲取服務實例信息,然後獲取ip和埠來訪問。 但是實際環境中,我們往往會開啟很多個user-service的集群。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢? 一般這 ...
  • 定義:定義一個創建產品對象的工廠介面,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。 工廠方法模式在簡單工廠模式的基礎上抽象出了 ...
  • 前言 開心一刻 說實話,作為一個宅男,每次被淘寶上的雄性店主追著喊親,親,親,這感覺真是噁心透頂,好像被強吻一樣。。。。。。。。。更煩的是我每次為了省錢,還得用個女號,跟那些店主說:“哥哥包郵嘛麽嘰。”,“哥哥再便宜點唄,我錢不夠了嘛,5555555,”。 知道後的店主 路漫漫其修遠兮,吾將上下而求 ...
  • 1. Python爬蟲入門教程 爬取背景 2019年1月10日深夜,打開了百思不得姐APP,想了一下是否可以爬呢?不自覺的安裝到了夜神模擬器裡面。這個APP還是比較有名和有意思的。 下麵是百思不得姐的簡介 年度超好玩的搞笑內容平臺,整個互聯網能嗨翻宇宙的神級腦洞大神段子手們都在這.. 新鮮的視頻,爆 ...
  • 題意 "題目鏈接" Sol 好像搞出了一個和題解不一樣的做法(然而我考場上沒寫出來還是爆零0) 一個很顯然的思路是考慮每個最小值的貢獻。 預處理出每個數左邊第一個比他小的數,右邊第一個比他大的數。 那麼$[L_i + 1, i]$對$[i, R_i]$中的每個數都會有$a[i]$的貢獻。 我們可以抽 ...
  • pip如今已經成為了Python的一大特色,可以很方便得協助Python開發者進行包管理。本文詳細介紹了pip命令的使用方法。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...