python物件導向之封裝

2021-09-26 13:19:17 字數 4435 閱讀 2736

在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 是對具體物件的一種抽象,即將某些部分隱藏起來,在程式外部看不到,其含義是其他程式無法呼叫。即 封裝 就是將抽象得到的資料和行為 或功能 相結合,形成乙個有機的整體 即類 封裝的目的是增強安全性和簡化程式設計,使用者不必了解具體的實現細節,而只是要通過外...