創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
小編給大家分享一下Python中是怎樣進(jìn)行封裝的,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
封裝(Encapsulation)是面向?qū)ο蟮娜筇卣髦唬硗鈨蓚€是繼承和多態(tài)),它指的是將對象的狀態(tài)信息隱藏在對象內(nèi)部,不允許外部程序直接訪問對象內(nèi)部信息,而是通過該類所提供的方法來實(shí)現(xiàn)對內(nèi)部信息的操作和訪問。
就好比使用計(jì)算機(jī),我們只需要使用計(jì)算機(jī)提供的鍵盤,就可以達(dá)到操作計(jì)算機(jī)的目的,至于在敲擊鍵盤時計(jì)算機(jī)內(nèi)部是如何工作,我們根本不需要知道。
Python 并沒有提供類似于其他語言的 private 等修飾符,因此 Python 并不能真正支持隱藏。為了隱藏類中的成員,Python 玩了一個小技巧:只要將 Python 類的成員命名為以雙下畫線開頭的,Python 就會把它們隱藏起來。
例如,如下程序示范了 Python 的封裝機(jī)制:
class User : def __hide(self): print('示范隱藏的hide方法') def getname(self): return self.__name def setname(self, name): if len(name) < 3 or len(name) > 8: raise ValueError('用戶名長度必須在3~8之間') self.__name = name name = property(getname, setname) def setage(self, age): if age < 18 or age > 70: raise ValueError('用戶名年齡必須在18在70之間') self.__age = age def getage(self): return self.__age age = property(getage, setage) # 創(chuàng)建User對象 u = User() # 對name屬性賦值,實(shí)際上調(diào)用setname()方法 u.name = 'fk' # 引發(fā) ValueError: 用戶名長度必須在3~8之間
上面程序?qū)?User 的兩個實(shí)例變量分別命名為 __name 和 __age,這兩個實(shí)例變量就會被隱藏起來,這樣程序就無法直接訪問 __name、__age 變量,只能通過 setname()、getname()、setage()、getage() 這些訪問器方法進(jìn)行訪問,而 setname()、setage() 會對用戶設(shè)置的 name、age 進(jìn)行控制,只有符合條件的 name、age 才允許設(shè)置。
上面程序嘗試將 User 對象的 name 設(shè)為 fk,這個字符串的長度為“2”不符合實(shí)際要求,因此運(yùn)行程序最后一行包含如下錯誤:
ValueError:用戶名長度必須在3-8之間
將最后一行代碼注釋掉,并在程序尾部添加如下代碼:
u.name = 'fkit' u.age = 25 print(u.name) # fkit print(u.age) # 25
此時程序?qū)?name、age 所賦的值都符合要求,因此上面兩行賦值語句完全可以正常運(yùn)行。運(yùn)行上面代碼,可以看到如下輸出結(jié)果:
fkit 25
從該程序可以看出封裝的好處,程序可以將 User 對象的實(shí)現(xiàn)細(xì)節(jié)隱藏起來,程序只能通過暴露出來的 setname()、setage() 方法來改變 User 對象的狀態(tài),而這兩個方法可以添加自己的邏輯控制,這種控制對 User 的修改始終是安全的。上面程序還定義了一個 __hide() 方法,這個方法默認(rèn)是隱藏的。如果程序嘗試執(zhí)行如下代碼:
# 嘗試調(diào)用隱藏的__hide()方法 u.__hide()
將會提示如下錯誤:
AttributeError:'User' object has no attribute 'hide'
最后需要說明的是,Python 其實(shí)沒有真正的隱藏機(jī)制,雙下畫線只是 Python 的一個小技巧,Python 會“偷偷”地改變以雙下畫線開頭的方法名,會在這些方法名前添加單下畫線和類名。因此上面的 __hide() 方法其實(shí)可以按如下方式調(diào)用(通常并不推薦這么干):
# 調(diào)用隱藏的__hide()方法 u._User__hide()
運(yùn)行上面代碼,可以看到如下輸出結(jié)果:
示范隱藏的hide方法
通過上面調(diào)用可以看出,Python 并沒有實(shí)現(xiàn)真正的隱藏。
類似的是,程序也可通過為隱藏的實(shí)例變量添加下畫線和類名的方式來訪問或修改對象的實(shí)例變量。例如如下代碼:
# 對隱藏的__name屬性賦值 u._User__name = 'fk' # 訪問User對象的name屬性(實(shí)際上訪問__name實(shí)例變量) print(u.name)
看完了這篇文章,相信你對Python中是怎樣進(jìn)行封裝的有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站標(biāo)題:Python中是怎樣進(jìn)行封裝的-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article28/joscp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、網(wǎng)站策劃、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容