Python 中的私有變數
私有變數在程式中用於訪問控制。Java 和 C++ 等程式語言已指定關鍵字來定義私有變數。
在 Python 中,我們沒有定義私有變數的關鍵字。本文將討論如何實現私有變數並使用類名訪問它們。
什麼是 Python 中的私有變數
我們不能在 Python 中建立私有變數,但我們可以使用特殊的命名約定來模擬私有變數的實現。
我們可以使用語法 objectName.attributeName
訪問物件的任何屬性。看例子。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.SSN = SSN
person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.SSN)
輸出:
Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890
我們建立了一個類 Person
,其屬性為 name
、age
和 SSN
。在建立 Person
類的例項 person1
後,我們使用語法 person1.name
、person1.age
和 person1
在類外部訪問屬性 name
、age
和 SSN
.SSN`。
我們不希望在類定義之外訪問 SSN
。我們沒有任何關鍵字可以在 Python 中建立私有變數。那麼我們應該如何模擬私有變數的實現呢?
在 Python 中如何實現私有變數
為了在 Python 中實現私有變數,我們將在變數名前使用雙下劃線 (__)
。讓我們使用雙下劃線定義 Person
類的屬性 SSN
。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.__SSN = SSN
如果我們建立 Person
類的例項 person1
並使用語法 person1.__SSN
訪問屬性 __SSN
,程式會顯示錯誤並引發下面的 AttributeError
異常。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.__SSN = SSN
person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.__SSN)
輸出:
Name of the person is: Alex
Age of the person is: 15
/usr/lib/Python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
File "/home/aditya1117/PycharmProjects/PythonProject/string1.py", line 11, in <module>
print("SSN of the person is:", person1.__SSN)
AttributeError: 'Person' object has no attribute '__SSN'
我們可以訪問除 __SSN
之外的所有其他屬性。該程式說沒有名為 __SSN
的屬性。那麼我們如何訪問屬性 __SSN
中的值呢?
在 Python 中訪問私有變數
我們不能在類定義之外訪問私有變數,但我們可以在內部訪問它。因此,我們可以在類內部建立一個方法來訪問私有變數值。
我們可以建立一個名為 getSSN()
的方法,它返回屬性 __SSN
的值,如下所示。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.__SSN = SSN
def getSSN(self):
return self.__SSN
person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.getSSN())
輸出:
Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890
我們可以直接訪問私有變數,而不是定義方法。讓我們看看私有變數是如何儲存在記憶體中的。當我們用雙下劃線 (__
) 定義變數名時,Python 直譯器會說沒有這樣的屬性。
要了解變數的儲存方式,我們將檢查給定物件的所有屬性。我們將使用 dir()
函式,它接受一個物件或輸入引數並返回所有物件屬性的列表。讓我們使用 dir()
函式檢查 person1
物件的屬性。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.__SSN = SSN
def getSSN(self):
return self.__SSN
person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Attributes of the Person are:")
print(dir(person1))
輸出:
Attributes of the Person are:
['_Person__SSN', '__doc__', '__init__', '__module__', 'age', 'getSSN', 'name']
觀察 name
和 age
屬性是否存在,但沒有 __SSN
屬性。但是,有一個名為 _Person__SSN
的屬性。讓我們為物件 person1
列印此屬性的值。
class Person:
def __init__(self, name, age, SSN):
self.name = name
self.age = age
self.__SSN = SSN
def getSSN(self):
return self.__SSN
person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1._Person__SSN)
輸出:
Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890
注意屬性 _Person__SSN
與 __SSN
具有相同的值。屬性 __SSN
在程式中儲存為 _Person__SSN
。每當我們訪問屬性 __SSN
時,程式都會遇到 AttributeError
異常。
在 Python 中,當我們使用雙下劃線 (__
) 定義屬性時,程式會在屬性名稱前新增 _className
。這個過程稱為重整。
Python 認為使用雙下劃線命名的屬性是修改中的私有變數。然而,這不是真的,因為我們可以使用語法 _className__attributeName
訪問變數。
Python 私有變數的結論
在本文中,我們討論了 Python 中的私有變數。我們已經看到,與其他程式語言不同,我們沒有任何特定的關鍵字來在 Python 中宣告私有變數。但是,我們可以通過使用雙下劃線字元命名變數來模擬私有變數的實現。
我們還討論了在 Python 中訪問私有變數的兩種方法。我們建議使用方法來訪問私有變數。使用帶有類名的方法將破壞實現私有變數的本質,因為我們將直接訪問該變數。該程式會警告你在屬性名稱之前使用 _className
訪問私有變數。