Python 中的單下劃線和雙下劃線

来源:https://www.cnblogs.com/edisonfish/archive/2023/11/29/17865662.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 當我們在學習 Python 的時候,可能會經常遇到單下劃線 _ 和雙下劃線 __ 這兩種命名方式 單下劃線 _ 和雙下劃線 __ 不僅僅是只是一種簡單的命名習慣,它們在 Python 中有著特殊的含義,對於代碼的可讀性和功能實現有著關鍵的作用。 那麼今天我們來看一看在 Pyth ...


哈嘍大家好,我是鹹魚

當我們在學習 Python 的時候,可能會經常遇到單下劃線 _ 和雙下劃線 __ 這兩種命名方式

單下劃線 _ 和雙下劃線 __ 不僅僅是只是一種簡單的命名習慣,它們在 Python 中有著特殊的含義,對於代碼的可讀性和功能實現有著關鍵的作用。

那麼今天我們來看一看在 Python 中單下劃線和雙下劃線的用法和意義

前導單下劃線

前導單下劃線(Leading Single Underscore)通常用於命名變數、方法和屬性,表示這些命名的元素是【私有】的或者說是【內部使用】的。

這種命名約定並不是嚴格的語言規則(即非強制性),而是一種約定,告訴開發人員該對象不應該被外部直接訪問或修改

_internal_variable = 10

比如說下麵的例子中,_internal_var_internal_method都以前導單下劃線開頭,表示它們是類的內部使用。

public_method是公共方法,可以在類外部訪問。

class MyClass:
    def __init__(self):
        self._internal_var = 42  # 前導單下劃線表示該變數是內部使用的

    def _internal_method(self):
        return 'This is an internal method'

    def public_method(self):
        # 在公共方法中調用內部方法和變數
        print(self._internal_method())
        print(f'The internal variable is: {self._internal_var}')

雖然可以在類外部訪問前導單下劃線命名的變數和方法,但是按照約定,建議只在類內部使用,而避免在類外部直接訪問它們。

單下劃線

單下劃線通常用作一個占位符,用於表示一個不重要的變數名或迭代中的臨時變數,即在解構賦值或迴圈迭代中不需要使用的變數

例子一中,_ 用作一個占位符變數,表示在tuple_returning_function()返回的元組中的某個值,但是在解構賦值中沒有被使用。

def tuple_returning_function():
    return (1,1), (2,2), (3,3)

_ , tuple_I_need, _ = tuple_returning_function()

例子二中,_ 用作迴圈迭代中的占位符,因為迴圈體中不需要使用迴圈變數的值,只是執行了三次列印操作

for _ in range(0,3):
  print("列印三次")

單尾隨下劃線

單個尾碼下劃線(Single trailing underscores)通常用於避免與 Python 關鍵字產生命名衝突。它被用作標識符的尾碼,以示與Python關鍵字有所區別。

比如說我想使用一個在 Python 中已經是保留關鍵字的變數名時,比如class、def、type等。為了避免衝突,可以添加尾碼下劃線

class_ = "Computer Science"
type_ = “字元串”

Dunder 方法

Dunder 方法指的是以雙下劃線(__)開頭和結尾的特殊方法(也稱為魔術方法或特殊方法)。

這些方法具有特殊的行為,可以在自定義類中重寫以改變類的行為。Dunder方法的名稱是Python中預定義的,例如__init____str____repr__等。

下麵是一些常見的 Dunder 方法:

  1. __init__(self, ...): 初始化方法,在對象實例化時調用,用於初始化對象的屬性。
  2. __str__(self): 將對象轉換為字元串表示形式,當使用print()函數或str()函數時調用。
  3. __repr__(self): 返回一個包含對象信息的字元串,通常用於開發和調試,可通過repr()函數調用。
  4. __len__(self): 返回對象的長度,通過len()函數調用。
  5. __getitem__(self, key): 獲取對象的元素,用於索引操作,例如obj[key]
  6. __setitem__(self, key, value): 設置對象的元素,用於索引賦值操作,例如obj[key] = value
  7. __delitem__(self, key): 刪除對象的元素,用於索引刪除操作,例如del obj[key]
  8. __call__(self, ...): 將對象作為函數調用,使得對象實例可調用。

我們在下麵的例子中定義了 __add__ dunder 方法,並創建了兩個實例

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

    def __str__(self):
        return f"({self.x}, {self.y})"
p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2
print(p3)  # Output: (4, 6)

我們定義了一個 Point 類,它有 xy 兩個實例變數以及__add__ 方法和__str__ 方法

當我們使用 + 運算符對 Point 的兩個實例(p1、p2)求和時,__add__ 會自動調用。它返回一個新 的 Point 對象(p3),其 xy 值是兩個原始 Point對象的 xy 值的和

當使用print()函數時調用自定義的__str__ 方法

前導雙下劃線

前導雙下劃線作為首碼在對象名前使用時,表示這是一個特殊的命名約定,它在類定義中用於創建私有屬性或方法。

當在類中使用雙下劃線作為首碼時,Python 解釋器會自動修改屬性名,以避免在子類中發生命名衝突。這個過程被稱為名稱修飾(name mangling)

比如下麵這個例子:

class MyClass:
    def __init__(self):
        self.__private_var = 10

    def get_private_var(self):
        return self.__private_var

# 創建類的實例
obj = MyClass()

# 嘗試訪問私有屬性
print(obj.__private_var)  # 會拋出 AttributeError 錯誤,因為這個屬性名稱已被修改

# 通過調用訪問私有屬性的方法來獲取
print(obj.get_private_var())  # 輸出: 10

__private_var屬性在類內部被訪問,但是在類外部直接訪問會導致 AttributeError 錯誤。

這是因為 Python 對 __private_var 進行了名稱修飾,實際名稱變成了 obj._MyClass__private_var,這樣避免了外部直接訪問

但是我們可以通過調用類內部方法 get_private_var() 在類外部訪問私有屬性。

通過使用前導雙下劃線,以確保類的某些屬性或方法只能從類本身內部訪問。這有助於防止意外修改重要的內部數據,並使代碼更加可靠和可維護

但如果你知道修飾後的名稱,你仍可以在類外部去訪問


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

-Advertisement-
Play Games
更多相關文章
  • big.js,一個小型、快速的用於任意精度的十進位算術的JavaScript 庫。 big.js 用於解決平常項目中進行算術運算時精度丟失引起的結果不准確的問題。和 big.js 類似的兩個庫 bignumber.js 和 decimal.js 也都是出自同一作者(MikeMcl)之手。 作者在 這 ...
  • 設計模式一直是程式員談論的“高端”話題之一,總有一種敬而遠之的心態。在瞭解後才知道在將函數作為一等對象的語言中,有許多需要利用對象多態性的設計模式,比如單例模式、 策略模式等,這些模式的結構與傳統面向對象語言的結構大相徑庭,實際上已經融入到了語言之中,我們可能經常使用它們,只是不知道它們的名字而已。 ...
  • Batrix企業能力庫,是京東物流戰略級項目-技術中台架構升級項目的基礎底座。致力於建立企業級業務復用能力平臺,依托能力復用業務框架Batrix,通過通用能力/擴展能力的定義及復用,靈活支持業務差異化場景的快速能力編排組裝,從而通過技術驅動的方式助力業務整體交付吞吐率。本文重點為大家介紹交易域如何使... ...
  • 當使用Spring Boot整合HikariCP時,您可以更加詳細地配置和優化連接池以獲得更好的性能。以下是更詳細的步驟和示例代碼: 步驟1:創建Spring Boot項目 您可以使用Spring Initializr(https://start.spring.io/)創建一個新的Spring Bo ...
  • Quora 的流量涉及大量閱讀而非寫入,一直致力於優化讀和數據量而非寫。 0 資料庫負載的主要部分 讀取 數據量 寫入 1 優化讀取 1.1 不同類型的讀需要不同優化 ① 複雜查詢,如連接、聚合等 在查詢計數已成為問題的情況下,它們在另一個表中構建了計數,以便它們可以直接讀取計數值而非計算計數。 ② ...
  • 寫在前面 最近比較迷AI繪圖,那就上個圖吧,我感覺還挺好看的。 可能會有人說,之前不一致分享的是flask嗎,怎麼突然改到django了? 這個問題問得好,開發環境遇到了一些小困難! 不過django,真的是很流行,一點都不過時,這您放心好了!不多說,直接看效果吧! 環境搭建 1、當前環境版本 py ...
  • and dest,src將目標與源做與操作 or dest,src將目標與源做或操作 add 加得數的值超出範圍即會溢出 inc 彙編語言中的自增指令,相當於++ div指令 不會給出被除數 切記提前在預設的寄存器中設置好被除數,且預設寄存器不做別的用處 dup設置記憶體空間,與db、dw、dd等數據 ...
  • 概述 - Overview 在我初學 C++ 時,static、inline、extern 可能是最令我迷惑的 C++ 說明符,原因是它們在不同的語境下會發揮不同的作用,而且某些說明符的含義已經和以前不同,這加劇了我在查詢資料時的困擾。所以今天決定好好總結一下。 首先要介紹 C++ 的兩個概念:存儲 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...