經典的面向對象語言,如 C++和 Java,通過公共、私有和受保護的關鍵字來控制對類資源的訪問。類的私有成員被拒絕從類外的環境訪問。它們只能在類內處理。
公眾成員
公共成員(通常是在類中聲明的方法)可以從類外部訪問。調用公共方法需要同一個類的對象。私有實例變量和公共方法的這種安排確保了數據封裝的原則。
默認情況下,Python 類中的所有成員都是公共的。任何成員都可以從類環境之外訪問。
Example: Public Attributes
class Student:
schoolName = 'XYZ School' # class attribute
def __init__(self, name, age):
self.name=name # instance attribute
self.age=age # instance attribute
您可以訪問Student
類的屬性,也可以修改它們的值,如下所示。
Example: Access Public Members
>>> std = Student("Steve", 25)
>>> std.schoolName
'XYZ School'
>>> std.name
'Steve'
>>> std.age = 20
>>> std.age
20
受保護成員
一個類的受保護成員可以從該類內部訪問,并且也可用于其子類。不允許其他環境訪問它。這使得父類的特定資源能夠被子類繼承。
Python 讓實例變量受保護的慣例是給它添加前綴 _(單下劃線)。 這有效地防止了它被訪問,除非它來自子類。
Example: Protected Attributes
class Student:
_schoolName = 'XYZ School' # protected class attribute
def __init__(self, name, age):
self._name=name # protected instance attribute
self._age=age # protected instance attribute
事實上,這并不妨礙實例變量訪問或修改實例。您仍然可以執行以下操作:
Example: Access Protected Members
>>> std = Student("Swati", 25)
>>> std._name
'Swati'
>>> std._name = 'Dipa'
>>> std._name
'Dipa'
但是,您可以使用屬性裝飾器定義一個屬性,并使其受到保護,如下所示。
Example: Protected Attributes
class Student:
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,newname):
self._name = newname
上圖,@property decorator 用于將name()
方法作為屬性,@name.setter
decorator 用于將name()
方法的另一個重載作為屬性設置器方法?,F在,_name
受到保護。
Example: Access Protected Members
>>> std = Student("Swati")
>>> std.name
'Swati'
>>> std.name = 'Dipa'
>>> std.name
'Dipa'
>>> std._name # still accessible
上圖,我們使用std.name
屬性修改_name
屬性。但是,它仍然可以在 Python 中訪問。 因此,負責任的程序員不會從類外訪問和修改以_
為前綴的實例變量。
私人成員
Python 沒有任何機制可以有效地限制對任何實例變量或方法的訪問。Python 規定了一個慣例,在變量/方法的名稱前加一個或兩個下劃線,以模仿受保護和私有訪問說明符的行為。
變量前面的雙下劃線__
使其成為私有的。 強烈建議不要在課外觸碰。任何嘗試都會導致屬性錯誤:
Example: Private Attributes
class Student:
__schoolName = 'XYZ School' # private class attribute
def __init__(self, name, age):
self.__name=name # private instance attribute
self.__salary=age # private instance attribute
def __display(self): # private method
print('This is private method.')
Example:
>>> std = Student("Bill", 25)
>>> std.__schoolName
AttributeError: 'Student' object has no attribute '__schoolName'
>>> std.__name
AttributeError: 'Student' object has no attribute '__name'
>>> std.__display()
AttributeError: 'Student' object has no attribute '__display'
Python 執行私有變量的名稱管理。每個帶雙下劃線的成員都將被更改為_object._class__variable
。因此,它仍然可以從課外訪問,但是應該避免這種做法。
Example:
>>> std = Student("Bill", 25)
>>> std._Student__name
'Bill'
>>> std._Student__name = 'Steve'
>>> std._Student__name
'Steve'
>>> std._Student__display()
'This is private method.'
因此,Python 提供了公共、受保護和私有訪問修飾符的概念實現,但不像其他語言,如 C# 、Java、C++。*****