在python中用雙下劃線開頭的方式將屬性隱藏起來(設定成私有的)
#其實這僅僅這是一種變形操作且僅僅只在類定義階段發生變形
#類中所有雙下劃線開頭的名稱如__x都會在類定義時自動變形成:_類名__x的形式:
classa:
__n=
0#類的資料屬性就應該是共享的,但是語法上是可以把類的資料屬性設定成私有的如__n,會變形為_a__n
def__init__
(self)
: self.__x=
10#變形為self._a__x
def__foo
(self)
:#變形為_a__foo
print
('from a'
)def
bar(self)
: self.__foo(
)#只有在類內部才可以通過__foo的形式訪問到.
#a._a__n是可以訪問到的,
#這種,在外部是無法通過__x這個名字訪問到。
這種變形需要注意的問題是:
1.這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如a._a__n,即這種操作並不是嚴格意義上的限制外部訪問,僅僅只是一種語法意義上的變形,主要用來限制外部的直接訪問。
2.變形的過程只在類的定義時發生一次,在定義後的賦值操作,不會變形
3.如果父類不想讓子類覆蓋其方法,可以將其設定為私有的。
# 先有乙個隱藏(私有)的概念
# 父類不想讓子類覆蓋其方法
# 其實就是在類定義階段進行了變形操作將__x變為_類名__x
classa:
def__fa
(self)
:# 此時方法名實際已經變為_a__fa
print
('from a'
)def
test
(self)
: self.__fa(
)# 這裡呼叫的__fa()實際上呼叫本類中的_a__fa()
class
b(a)
:def
__fa
(self)
:# 此時方法名已經變為_b__fa
print
('from b'
)b = b(
)# 例項化物件
# 呼叫物件的test方法,b類中沒有,呼叫的是父類(a類)的test方法,而a類中的test方法呼叫_a__fa()方法
b.test(
)
封裝的真諦在於明確地區分內外,封裝的屬性可以直接在內部使用,而不能被外部直接使用,然而定義屬性的目的終歸是要用,外部要想用類隱藏的屬性,需要我們為其開闢介面,讓外部能夠間接地用到我們隱藏起來的屬性,那這麼做的意義何在???
"""
封裝資料屬性,將資料隱藏,提供乙個介面來操作它
這樣我們就可以在介面上附加對該資料的操作的限制(其實就是一些功能)
這樣就可以完成對資料操作的嚴格控制
"""class
teacher
:def
__init__
(self, name, age)
: self.set_info(name, age)
# 介面函式
defset_info
(self, name, age)
:# 定義乙個介面函式
ifnot
isinstance
(name,
str)
:raise typeerror(
'姓名必須是字串')if
notisinstance
(age,
int)
:raise typeerror(
'年齡必須是整型'
) self.__name = name
self.__age = age
deftell_info
(self)
:print
('姓名:%s, 年齡:%s'
%(self.__name, self.__age)
)f = teacher(
'egon',18
)# print(f.__dict__)
f.tell_info(
)f.set_info(
'liu',20
)# 通過介面函式對物件進行修改
f.tell_info(
)
# 封裝方法(函式屬性)其目的是隔離複雜度
"""取款是功能,而這個功能有很多功能組成:插卡、密碼認證、輸入金額、列印賬單、取錢
對使用者來說,只需要知道取款這個功能即可,其餘功能我們都可以隱藏起來,很明顯這麼做
隔離了複雜度,同時也提公升了安全性
"""class
atm:
def__card
(self)
:print
('插卡'
)def
__auth
(self)
:print
('使用者認證'
)def
__input
(self)
:print
('輸入取款金額'
)def
__print
(self)
:print
('列印賬單'
)def
__take_maney
(self)
:print
('取款'
)# 將這些方法全部隱藏
defwithdaw
(self)
:# 只有withdaw方法可以外部呼叫(實際上是乙個介面函式)
self.__card(
) self.__auth(
) self.__input(
) self.__print(
) self.__take_maney(
)a = atm(
)a.withdaw(
)# 這樣我們只需要呼叫乙個函式就可以完成取款功能
python中封裝其實就是一種思想,有了封裝之後,提公升了**的擴充套件性。
#類的設計者
class
room
:def
__init__
(self,name,owner,width,length,high)
: self.name=name
self.owner=owner
self.__width=width
self.__length=length
self.__high=high
deftell_area
(self)
:#對外提供的介面,隱藏了內部的實現細節,此時我們想求的是面積
return self.__width * self.__length
#使用者
>>
> r1=room(
'臥室'
,'egon',20
,20,20
)>>
> r1.tell_area(
)#使用者呼叫介面tell_area
#類的設計者,輕鬆的擴充套件了功能,而類的使用者完全不需要改變自己的**
class
room
:def
__init__
(self,name,owner,width,length,high)
: self.name=name
self.owner=owner
self.__width=width
self.__length=length
self.__high=high
deftell_area
(self)
:#對外提供的介面,隱藏內部實現,此時我們想求的是體積,內部邏輯變了,只需求修該下列一行就可以很簡答的實現,而且外部呼叫感知不到,仍然使用該方法,但是功能已經變了
return self.__width * self.__length * self.__high
#對於仍然在使用tell_area介面的人來說,根本無需改動自己的**,就可以用上新功能
>>
> r1.tell_area(
)
python物件導向之封裝
封裝 1.封裝是物件導向程式設計的一大特點 2.物件導向程式設計的第一步 將屬性和方法封裝到乙個抽象的類中 3.外界使用類建立物件,然後讓物件呼叫方法 4.物件方法的細節都被封裝在類的內部 需求 1 1.小明體重75.0公斤 2.小明每次跑步都會 0.5公斤 3.小明每次吃東西體重都會增加1公斤 需...
python物件導向之 封裝
1.先看隱藏。在python中用兩個下劃線開頭的方式將屬性隱藏起來。注意 這種只是語法的變形,在讀到有以 開的的函式時,會自動將名稱變成 類名 屬性 這種格式,所以在函式外部是無法通過 屬性 找到這個屬性的。class foo n 111111 將屬性隱藏起來 在定義階段會變成 foo n def ...
python物件導向(二)之封裝
在程式設計中,封裝 encapsulation 是對具體物件的一種抽象,即將某些部分隱藏起來,在程式外部看不到,其含義是其他程式無法呼叫。即 封裝 就是將抽象得到的資料和行為 或功能 相結合,形成乙個有機的整體 即類 封裝的目的是增強安全性和簡化程式設計,使用者不必了解具體的實現細節,而只是要通過外...