Python 變數中雙下劃線字首的作用是什麼?


當在 Python 變數前新增雙下劃線作為字首時,名稱改編過程將應用於特定的識別符號(__var)

為了避免與子類發生命名衝突,名稱改編包括重寫屬性名稱。

示例

以下是解釋 Python 中雙下劃線的程式:

class Python: def __init__(self): self.car = 5 self._buzz = 9 self.__fee = 2 d = Python() print(dir(d))

輸出

以下是上述程式碼的輸出:

['_Python__fee', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_buzz', 'car']

理解上述程式碼

  • 在上面的程式碼中,將一個類作為示例,比較了單下劃線、雙下劃線和普通元素。

  • 此處使用基本的關鍵字 car、buzz 和 fee 作為佔位符,用於表示根據輸入條件或程式收到的新資料而可能發生變化的值。

  • 在此,dir() 函式提供了作為引數傳遞給函式的物件的有效屬性列表。

在上面的程式碼中,car 和 _buzz 變數似乎不受影響,但 __fee 變數已更改為 _Python__fee。以這種方式對其執行名稱改編,以防止變數在子類中被覆蓋。雙

下劃線 (__) 字首變數在 Python 中

在 Python 中,私有變數使用雙下劃線字首定義。這有時也稱為“dunder”。這些名稱強制執行它們引用的變數的區域性作用域。當在函式中使用雙下劃線宣告變數時,Python 會對其名稱進行改編,以便它無法超出作用域。

示例

以下是 Python 中雙下劃線字首變數的示例:

我們將以名為 Python 的類為例。將向此類新增一個名為 __name 的函式可設定屬性。此外,我們將建立一種方法供函式訪問 __name 屬性。

class Sports: def __init__(self, players): self.players = players def names(self, names): self.__names = names def GetName(self): return self.__names Cricket = Sports(12) Cricket.names("Sachin Tendulkar") print(Cricket.GetName()) print(Cricket.players) print(Cricket.__names)

輸出

當我們從類內部訪問板球運動時,上面的程式碼會為其命名並輸出名稱。您可以從下面的輸出中看到,雖然我們可以直接訪問球員,但我們無法對名稱執行此操作。

Sachin Tendulkar12
Traceback (most recent call last):
   File "main.py", line 12, in <module>
print(Cricket.__names)AttributeError: 'Sports' object has no attribute '__names'

示例

為了演示如何覆蓋函式,讓我們建立一個從 Coding 類繼承的新類。

class PythonClass(): def __init__(self): super().__init__() self.d = "overriding" self._e = "overriding" self.__f = "overriding" object2 = PythonClass() print(object2.d) print(object2._e) print(object2.__f)

輸出

以下是上述程式碼的輸出:

overriding
overriding
Traceback (most recent call last):
  File "main.py", line 12, in 
print(object2.__f)AttributeError: 'PythonClass' object has no attribute '__f'

名稱改編在這裡再次起作用。object2.f 更改為 _PythonClass__f。現在,使用修改後的屬性列印該元素。

print(object2._PythonClass__f)

現在,輸出如下:

overriding
overriding
overriding

示例

以下示例確定可以使用類的某些方法來訪問雙下劃線字首變數。

class Python: def __init__(self): self.__datacamp = "Programming" def get_datacamp(self): return self.__datacamp object = Python() # Printing the "Programming" that is a __var print(object.get_datacamp()) # An error occurs here. The name of the variable is changed print(object.__datacamp)

輸出

以下是上述程式碼的輸出:

Programming
Traceback (most recent call last):
  File "main.py", line 11, in <module>
print(object.__datacamp)
AttributeError: 'Python' object has no attribute '__datacamp'

示例

此外,對於方法名稱,您可以使用雙下劃線字首。

class Python: def __getdatacamp(self): return "Programming" def calling_datacamp(self): return self.__getdatacamp() object = Python() # Returning the double underscore prefix method print(object.calling_datacamp()) # An error occurs here print(object.__getdatacamp())

輸出

以下是上述程式碼的輸出:

Programming
Traceback (most recent call last):
  File "main.py", line 11, in 
    print(object.__getdatacamp())
AttributeError: 'Python' object has no attribute '__getdatacamp'

示例

讓我們再看看名稱改編。我們首先將建立一個名為 Python 的變數,然後我們將嘗試使用雙下劃線字首名稱訪問它。

_Python__name = "Programming" class Python: def return_name(self): return __name object = Python() # The __name variable gets printed print(object.return_name())

輸出

以下是上述程式碼的輸出:

Programming

更新於: 2022-11-23

5K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.