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

2022-09-28 20:48:21 字數 2944 閱讀 4757

【封裝】

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

【好處】

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(www.cppcns.com)

>>> 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_area

400#類的設計者,輕鬆的擴充套件了功能,而類的使用者完全不需要改變自己的**

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.__woobyzaidth * self.__length * self.__high

#對於仍然在使用tell_area介面的人來說,根本無需改動自己的**,就可以用上新功能

>>> r1.tell_area()

400property屬性

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

@property

@obj.setter

@obj.deleter

為什麼要用property

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

python實現運算元據庫的方法封裝

常見的資料庫操作的方法封裝 import pymysql class dbfunc def init self,host,port,user,pwd,name,charset self.host host self.port port self.user user self.pwd pwd self...

KNN演算法原理與python實現

knn演算法python實現 參考文獻 knn k nearest neighbor 演算法,顧名思義,其原理也就是 近朱者赤,近墨者黑 knn演算法是一種有監督的分類演算法,輸入同樣為樣本特徵值向量以及對應的類標籤,輸出則為具有分類功能的模型,能夠根據輸入的特徵值 分類結果。核心原理就是,與待分類...

Python 封裝的實現

1.更改屬性名 封裝是物件導向的三大特性之一 封裝指的是隱藏物件中一些不希望被外部所訪問到的屬性或方法 如何隱藏乙個物件中的屬性?將物件的屬性名,修改為乙個外部不知道的名字 如何獲取 修改 物件中的屬性?需要提供乙個getter和setter方法使外部可以訪問到屬性 getter 獲取物件中的指定屬...