您的“關注”和“點贊”,是信任,是認可,是支持,是動力…
如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。
文章目錄
面向對象編程語言三大特性,如下所示,
- 封裝:請參見本文。
- 繼承:請參見博文《Python 繼承詳解》。
- 多態:請參見博文《Python 多態詳解》。
1 封裝概述
封裝(Encapsulation),指的是在設計類時, 將不需要對外提供的內容都隱藏起來,提供公共方法以供外部對其訪問。
具體指的是刻意地將一些屬性和方法隱藏(私有化)在類的內部,這樣在使用此類時,將無法直接以類對象.屬性名
、或 類對象.方法名(參數)
的形式調用這些私有屬性或私有方法,而只能用未隱藏的公有方法間接操作這些隱藏的私有屬性和私有方法。
封裝的優點,如下所示:
- 封裝保證了類內部數據結構的完整性:封裝之後,用戶無法直接看到類中的數據結構,只能使用類允許公開的數據(通常指公有方法),很好地避免了外部對內部數據的影響,提高了程序的可維護性。
- 封裝數據可以很好的保護隱私。
- 封裝方法的主要原因是隔離複雜度。
- 封裝提高了代碼的複用性。
- 還可以輕鬆實現避免用戶對類中屬性和方法的不合理操作:用戶只能藉助暴露出來的類方法來訪問數據,我們只需要在這些暴露的方法中加入適當的控制邏輯,即可輕鬆實現用戶對類中屬性或方法的不合理操作。
2 Python 類的簡單封裝
爲了實現 Python 類的封裝,Python 採取了下面的方法:
- 公有(共有):默認情況下,類中的變量和方法都是公有的,它們的名稱前都沒有下劃線,公有的變量和方法,在類的外部、類內部以及子類中,都可以正常訪問。
- 私有:類中的變量或方法以雙下劃線
__
開頭命名,則該變量或方法爲私有的,私有的變量或方法,只能在本類內部使用,類的外部以及子類都無法使用。 - 也有把變量名或方法名以單下劃線
_
開頭定義的,通常也表示私有的。
舉例如下所示:
class Person:
def setName(self, name):
if len(name) <= 0:
raise ValueError('姓名長度要大於 0 。')
self.__name = name
def getName(self):
return self.__name
# 爲 name 配置 property() 函數
name = property(getName, setName)
def setAddress(self, address):
if address.startswith("http://"): # 判斷網址要是否是 http:// 開頭
self.__address = address
else:
raise ValueError('地址必須以 http:// 開頭')
def getAddress(self):
return self.__address
# 爲 add 配置 property() 函數
address = property(getAddress, setAddress)
# 定義私有展示方法
def __display(self):
print(self.__name, self.__address)
person = Person() # 創建 Person 類的對象
person.name = '碼農阿杰'
person.address = 'https://blog.csdn.net/manongajie'
print(person.name)
print(person.address)
運行結果:
碼農阿杰
https://blog.csdn.net/manongajie