Python封裝原理與實現(xiàn)方法詳解
本文實例講述了Python封裝原理與實現(xiàn)方法。分享給大家供大家參考,具體如下:
【封裝】
隱藏對象的屬性和實現(xiàn)細(xì)節(jié),僅對外提供公共訪問方式。
【好處】
1. 將變化隔離;
2. 便于使用;
3. 提高復(fù)用性;
4. 提高安全性;
【封裝原則】
1. 將不需要對外提供的內(nèi)容都隱藏起來;
2. 把屬性都隱藏,提供公共方法對其訪問。
私有變量和私有方法
在python中用雙下劃線開頭的方式將屬性隱藏起來(設(shè)置成私有的)
私有變量
#其實這僅僅這是一種變形操作 #類中所有雙下劃線開頭的名稱如__x都會自動變形成:_類名__x的形式: class A: __N=0 #類的數(shù)據(jù)屬性就應(yīng)該是共享的,但是語法上是可以把類的數(shù)據(jù)屬性設(shè)置成私有的如__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() #只有在類內(nèi)部才可以通過__foo的形式訪問到. #A._A__N是可以訪問到的,即這種操作并不是嚴(yán)格意義上的限制外部訪問,僅僅只是一種語法意義上的變形
這種自動變形的特點:
1.類中定義的__x
只能在內(nèi)部使用,如self.__x
,引用的就是變形的結(jié)果。
2.這種變形其實正是針對外部的變形,在外部是無法通過__x
這個名字訪問到的。
3.在子類定義的__x
不會覆蓋在父類定義的__x
,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。
這種變形需要注意的問題是:
1.這種機(jī)制也并沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然后就可以訪問了,如a._A__N
2.變形的過程只在類的定義是發(fā)生一次,在定義后的賦值操作,不會變形
私有方法
#正常情況 >>> 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() #只會與自己所在的類為準(zhǔn),即調(diào)用_A__fa ... >>> class B(A): ... def __fa(self): ... print('from B') ... >>> b=B() >>> b.test() from A
封裝與擴(kuò)展性
封裝在于明確區(qū)分內(nèi)外,使得類實現(xiàn)者可以修改封裝內(nèi)的東西而不影響外部調(diào)用者的代碼;而外部使用用者只知道一個接口(函數(shù)),只要接口(函數(shù))名、參數(shù)不變,使用者的代碼永遠(yuǎn)無需改變。這就提供一個良好的合作基礎(chǔ)——或者說,只要接口這個基礎(chǔ)約定不變,則代碼改變不足為慮。
#類的設(shè)計者 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 def tell_area(self): #對外提供的接口,隱藏了內(nèi)部的實現(xiàn)細(xì)節(jié),此時我們想求的是面積 return self.__width * self.__length
#使用者 >>> r1=Room('臥室','egon',20,20,20) >>> r1.tell_area() #使用者調(diào)用接口tell_area 400
#類的設(shè)計者,輕松的擴(kuò)展了功能,而類的使用者完全不需要改變自己的代碼 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 def tell_area(self): #對外提供的接口,隱藏內(nèi)部實現(xiàn),此時我們想求的是體積,內(nèi)部邏輯變了,只需求修該下列一行就可以很簡答的實現(xiàn),而且外部調(diào)用感知不到,仍然使用該方法,但是功能已經(jīng)變了 return self.__width * self.__length * self.__high #對于仍然在使用tell_area接口的人來說,根本無需改動自己的代碼,就可以用上新功能 >>> r1.tell_area() 400
property屬性
property是一種特殊的屬性,訪問它時會執(zhí)行一段功能(函數(shù))然后返回值
@property
@obj.setter
@obj.deleter
為什么要用property
將一個類的函數(shù)定義成特性以后,對象再去使用的時候obj.name
,根本無法察覺自己的name是執(zhí)行了一個函數(shù)然后計算出來的,這種特性的使用方式遵循了統(tǒng)一訪問的原則
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python面向?qū)ο笾惖姆庋b操作示例
- Python面向?qū)ο蟪绦蛟O(shè)計中類的定義、實例化、封裝及私有變量/方法詳解
- Python 面向?qū)ο笾庋b、繼承、多態(tài)操作實例分析
- Python面向?qū)ο蟪绦蛟O(shè)計類的封裝與繼承用法示例
- Python面向?qū)ο蠓庋b操作案例詳解
- 基于python3 類的屬性、方法、封裝、繼承實例講解
- Python面向?qū)ο笾接袑傩院退接蟹椒☉?yīng)用案例分析
- Python面向?qū)ο笾^承原理與用法案例分析
- Python面向?qū)ο笾鄳B(tài)原理與用法案例分析
- python面向?qū)ο笾悓傩院皖惙椒ò咐治?/a>
- Python面向?qū)ο蠓庋b操作案例詳解 II
相關(guān)文章
Python的控制結(jié)構(gòu)之For、While、If循環(huán)問題
這篇文章主要介紹了Python的控制結(jié)構(gòu)之For、While、If循環(huán)問題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Python如何設(shè)置utf-8為默認(rèn)編碼的問題
這篇文章主要介紹了Python如何設(shè)置utf-8為默認(rèn)編碼的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Python使用matplotlib.pyplot畫熱圖和損失圖的代碼詳解
眾所周知,在完成論文相關(guān)工作時畫圖必不可少,如損失函數(shù)圖、熱力圖等是非常常見的圖,在本文中,總結(jié)了這兩個圖的畫法,下面給出了完整的代碼,開箱即用,感興趣的同學(xué)可以自己動手嘗試一下2023-09-09matplotlib源碼解析標(biāo)題實現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異)
這篇文章主要介紹了matplotlib源碼解析標(biāo)題實現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02