第十一章 類的封裝

2022-05-15 01:24:10 字數 3545 閱讀 6486

目錄從封裝本身的意思去理解,封裝就好像是拿來乙個麻袋,把小貓,小狗,小王八,還有alex一起裝進麻袋,然後把麻袋封上口子。照這種邏輯看,封裝=『隱藏』,這種理解是相當片面的

*在python中用雙下劃線開頭的方式將屬性隱藏起來(設定成私有的)*

#其實這僅僅這是一種變形操作且僅僅只在類定義階段發生變形

#類中所有雙下劃線開頭的名稱如__x都會在類定義時自動變形成:_類名__x的形式:

class a:

__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.在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的*

#正常情況

>>> class a:

... def fa(self):

... print('from a')

... def test(self):

... self.fa()

...

>>> class b(a):

... def fa(self):

... print('from b')

...

>>> b=b()

>>> b.test()

from b

#把fa定義成私有的,即__fa

>>> class a:

... def __fa(self): #在定義時就變形為_a__fa

... print('from a')

... def test(self):

... self.__fa() #只會與自己所在的類為準,即呼叫_a__fa

...

>>> class b(a):

... def __fa(self):

... print('from b')

...

>>> b=b()

>>> b.test()

from a

封裝的真諦在於明確地區分內外,封裝的屬性可以直接在內部使用,而不能被外部直接使用,然而定義屬性的目的終歸是要用,外部要想用類隱藏的屬性,需要我們為其開闢介面,讓外部能夠間接地用到我們隱藏起來的屬性,那這麼做的意義何在???1:封裝資料:將資料隱藏起來這不是目的。目的在於隱藏起來然後對外提供操作該資料的介面,然後我們可以在介面附加上對該資料操作的限制,以此完成對資料屬性操作的嚴格控制,提高安全性。

class teacher:

def __init__(self,name,age):

# self.__name=name

# self.__age=age

self.set_info(name,age)

def tell_info(self):

print('姓名:%s,年齡:%s' %(self.__name,self.__age))

def set_info(self,name,age):

#--------------控制資料-----------------

if not isinstance(name,str):

raise typeerror('姓名必須是字串型別')

if not isinstance(age,int):

raise typeerror('年齡必須是整型')

#---------------------------------------

self.__name=name

self.__age=age

t=teacher('egon',18)

t.tell_info()

t.set_info('egon',19)

t.tell_info()

2:封裝方法:目的是隔離複雜度

封裝方法舉例:

1. 你的身體沒有一處不體現著封裝的概念:你的身體把膀胱尿道等等這些尿的功能隱藏了起來,然後為你提供乙個尿的介面就可以了(介面就是你的。。。,),你總不能把膀胱掛在身體外面,上廁所的時候就跟別人炫耀:hi,man,你瞅我的膀胱,看看我是怎麼尿的。

2. 電視機本身是乙個黑盒子,隱藏了所有細節,但是一定會對外提供了一堆按鈕,這些按鈕也正是介面的概念,所以說,封裝並不是單純意義的隱藏!!!

3. 快門就是傻瓜相機為傻瓜們提供的方法,該方法將內部複雜的照相功能都隱藏起來了

#取款是功能,而這個功能有很多功能組成:插卡、密碼認證、輸入金額、列印賬單、取錢

#對使用者來說,只需要知道取款這個功能即可,其餘功能我們都可以隱藏起來,很明顯這麼做

#隔離了複雜度,同時也提公升了安全性

class atm:

def __card(self):

print('插卡')

def __auth(self):

print('使用者認證')

def __input(self):

print('輸入取款金額')

def __print_bill(self):

print('列印賬單')

def __take_money(self):

print('取款')

#-----------withdraw是介面--------------

def withdraw(self):

self.__card()

self.__auth()

self.__input()

self.__print_bill()

self.__take_money()

# ----------------------------------

a=atm()

a.withdraw()

第十一章 物件導向 封裝 思想

封裝 encapsulation 封裝 是指隱藏物件的屬性和實現細節,僅對外提供公共訪問方式.好處 將變化隔離.便於使用.提供重用性 提高安全性.封裝原則 將不需要對外提供的內容都隱藏起來.把屬性都隱藏,提供公共方法對其訪問.private 私有,是乙個許可權修飾符,用於修飾符成員 私有的內容之在本...

c primer 第十一章 使用類

一,操作符過載 1 函式過載 多型 名稱相同,特徵標 引數列表 不同的函式。完成相同的基本操作 2 操作符左側的對像是呼叫物件,操作符右側的作為引數被傳遞的物件 3 過載限制 1 過載後的操作符至少有乙個運算元是使用者定義的型別。防止使用者為標準型別過載操作符 2 使用操作符,不能違反操作符原來的句...

Python 第十一章 測試類

python 第十一章 測試類 class anonymoussurvey 收集匿名調查問卷的答案 definit self,question 儲存乙個問題,並為儲存答案做準備 self.question question self.responses def show questions self...