国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python封裝原理與實現方法詳解

2020-01-04 14:37:57
字體:
來源:轉載
供稿:網友

本文實例講述了Python封裝原理與實現方法。分享給大家供大家參考,具體如下:

【封裝】

 隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

【好處】

1. 將變化隔離;

2. 便于使用;

3. 提高復用性;

4. 提高安全性;

【封裝原則】

1. 將不需要對外提供的內容都隱藏起來;

2. 把屬性都隱藏,提供公共方法對其訪問。

私有變量和私有方法

在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是可以訪問到的,即這種操作并不是嚴格意義上的限制外部訪問,僅僅只是一種語法意義上的變形

這種自動變形的特點:

1.類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。

2.這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。

3.在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。

這種變形需要注意的問題是:

1.這種機制也并沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然后就可以訪問了,如a._A__N

2.變形的過程只在類的定義是發生一次,在定義后的賦值操作,不會變形

私有方法

#正常情況>>> 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

封裝與擴展性

封裝在于明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部調用者的代碼;而外部使用用者只知道一個接口(函數),只要接口(函數)名、參數不變,使用者的代碼永遠無需改變。這就提供一個良好的合作基礎——或者說,只要接口這個基礎約定不變,則代碼改變不足為慮。

#類的設計者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): #對外提供的接口,隱藏了內部的實現細節,此時我們想求的是面積    return self.__width * self.__length
#使用者>>> r1=Room('臥室','egon',20,20,20)>>> r1.tell_area() #使用者調用接口tell_area400
#類的設計者,輕松的擴展了功能,而類的使用者完全不需要改變自己的代碼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): #對外提供的接口,隱藏內部實現,此時我們想求的是體積,內部邏輯變了,只需求修該下列一行就可以很簡答的實現,而且外部調用感知不到,仍然使用該方法,但是功能已經變了    return self.__width * self.__length * self.__high#對于仍然在使用tell_area接口的人來說,根本無需改動自己的代碼,就可以用上新功能>>> r1.tell_area()400

property屬性

property是一種特殊的屬性,訪問它時會執行一段功能(函數)然后返回值

@property

@obj.setter

@obj.deleter

為什么要用property

將一個類的函數定義成特性以后,對象再去使用的時候obj.name,根本無法察覺自己的name是執行了一個函數然后計算出來的,這種特性的使用方式遵循了統一訪問的原則


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐山市| 林口县| 来凤县| 阿瓦提县| 鞍山市| 五大连池市| 嘉祥县| 富平县| 长乐市| 彰化县| 安乡县| 左权县| 错那县| 克拉玛依市| 江永县| 娄烦县| 永康市| 台前县| 抚松县| 鹰潭市| 太仆寺旗| 丰县| 禹城市| 潞西市| 遵化市| 长阳| 财经| 平罗县| 普兰县| 奉贤区| 清徐县| 兴宁市| 鄱阳县| 星座| 靖西县| 绥江县| 东乡县| 云林县| 泗洪县| 青神县| 施秉县|