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)
輸出
當我們從類內部訪問 Cricket Sports 時,上面的程式碼會為其命名並輸出名稱。您可以從下面的輸出中看到,雖然我們可以直接訪問 players,但我們無法對 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, inprint(object2.__f)AttributeError: 'PythonClass' object has no attribute '__f'
名稱混淆在這裡再次起作用。object2.f 被更改為 _PythonClass__f。現在,使用修改後的 Attribute 將該元素打印出來。
print(object2._PythonClass__f)
現在,輸出如下:
overriding overriding overriding
示例
以下示例確定可以使用類的 methods 來訪問雙下劃線字首變數。
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, inprint(object.__getdatacamp()) AttributeError: 'Python' object has no attribute '__getdatacamp'
示例
讓我們再來看一下名稱混淆。我們首先建立一個名為 Python 的變數,然後嘗試使用 Doble Pre Underscore 名稱訪問它。
_Python__name = "Programming" class Python: def return_name(self): return __name object = Python() # The __name variable gets printed print(object.return_name())
輸出
以下是上述程式碼的輸出:
Programming
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP