封裝:即在設計類時,刻意的將一些屬性和方法隱藏在類的內部,這樣將無法直接以"類對象.屬性名"(或者"類對象.方法名(參數)")的形式調用這些屬性(或方法),而只能用未隱藏的方法間接的操作這些隱藏的屬性和方法。
- 封裝機制保證了類內部數據結構的完整性,很好的避免了外部對內部數據的影響,提高了程序的可維護性。
- 避免用戶對類中屬性或方法進行不合理的操作。
- 提供代碼的復用性。
python類如何進行封裝
不同於其他面向對象的編程語言,python類中的變量和函數不是共有的就是私有的。
- public:公有屬性的類變量和類函數,在類的外部、類內部以及子類中,都可以正常訪問
- private:私有屬性的類變量和類函數,只有在本類內部使用,類的外部以及子類都無法使用。
但是,python並沒有提供public、private這些修飾符。為了實現類的封裝,python采取了下面的方法:
- 默認情況下,python類中的變量和方法都是公有的,它們的名稱前都沒有下划線(_)
- 如果類中的變量和函數,其名稱以雙下划線“__”開頭,則該變量或函數為私有的。
- 以單下划線“_”開頭的類屬性和類方法約定俗成的被視為私有屬性和私有方法,雖然它們也能通過類對象正常訪問,但是建議不要這樣。
- 以雙下划線開頭和結尾的類方法(如__init__())時python內部定義的,自己定義時,不要使用這種格式。
class Person:
def setname(self, name):
if len(name) < 3:
raise ValueError('名稱長度必須大於3!')
self.__name = name
def getname(self):
return self.__name
#為name配置setter和getter方法
name = property(getname, setname)
def setage(self, age):
if age < 100:
self.__age = age
else:
raise ValueError('年齡必須小於100!')
def getage(self):
return self.__age
#為age配置getter和setter方法
age = property(getage, setage)
#定義私有方法
def __display(self):
print(self.__name, "今年", self.__age, "歲。")
xiaobai = Person()
xiaobai.name = "xiaobai"
xiaobai.age = 20
print(xiaobai.name)
print(xiaobai.age)
xiaobai
20