Python 中的雙下劃線

Vaibhhav Khetarpal 2023年1月30日
  1. 在 Python 中使用雙前導下劃線
  2. 在 Python 中使用雙前導和尾隨下劃線
Python 中的雙下劃線

下劃線 (_) 和雙下劃線 (__) 在 Python 程式設計世界中都具有重要意義,並且被程式設計師過度使用以用於不同目的。雙下劃線非常方便,在 Python 程式碼中經常遇到。

在本文中,我們將討論 Python 中雙下劃線的含義。

在 Python 中使用雙前導下劃線

當雙下劃線引導給定識別符號 (__var) 時,名稱修改過程就會發生在該特定識別符號上。

Name mangling,簡單來說就是對屬性名進行基本的改寫,以防止與子類的命名衝突。

你可以使用以下程式碼來解釋 Python 中的雙前導下劃線。

class E1:
    def __init__(self):
        self.bar = 11
        self._baz = 23
        self.__foo = 23


x = E1()
print(dir(x))

輸出:

['_E1__foo', '__doc__', '__init__', '__module__', '_baz', 'bar']

解釋

  • 在上面的程式碼中,我們拿一個類來比較單下劃線、雙下劃線和普通元素。
  • 元素 foo, bar, baz 是簡單的關鍵字,在這裡用作佔位符,用於在傳遞給程式的條件或程式收到的新資訊時發生變化的值。
  • dir() 函式在此處用於提供作為函式引數傳遞的給定物件的有效屬性列表。

在上面的程式碼中,我們注意到 bar_baz 變數看起來沒有變化,而 __foo 變數已更改為 _E1__foo。這是在變數上發生名稱糾纏的過程,這樣做是為了保護變數不被子類覆蓋。

這種帶有前導雙下劃線的變數名稱修改過程對程式設計師來說是完全透明的。名稱修飾與雙下劃線開頭的所有內容(包括函式)互動並更改。

在 Python 中使用雙前導和尾隨下劃線

當一個變數在前後兩邊都被雙下劃線包圍時,名稱修改過程不適用於它。

Python 直譯器將忽略由雙下劃線作為字首和字尾聚集的變數。

你可以使用以下程式碼來解釋 Python 中的雙前導和尾隨下劃線。

class A:
    def __init__(self):
        self.__foo__ = 10


print(A().__foo__)

輸出:

10

在上面的程式碼中,帶有雙下劃線作為字首和字尾的 foo 變數被直譯器忽略,並且不會發生名稱修飾。該函式的值作為輸出返回,證明該變數存在於物件屬性列表中。

一些獨特的名稱,如 initcall 同時包含前導和尾隨雙下劃線,在 Python 語言中被保留用於特殊用途。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

相關文章 - Python Syntax