python繼承——封裝
1 為什麼要封裝
封裝資料的主要原因是:保護隱私
封裝方法的主要原因是:隔離複雜度
2 封裝分為兩個層面
第乙個層面的封裝(什麼都不用做):建立類和物件會分別建立二者的命名空間,我們只能用類名.或者obj.的方式去訪問裡面的名字,這本身就是一種封裝
>>> r1.nickname
'草叢倫'
>>> riven.camp
'noxus'
注意:對於這一層面的封裝(隱藏),類名.和例項名.就是訪問隱藏屬性的介面
第二個層面的封裝:類中把某些屬性和方法隱藏起來(或者說定義成私有的),只在類的內部使用、外部無法訪問,或者留下少量介面(函式)供外部訪問。
在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的形式訪問到.
這種自動變形的特點:
1.類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。
2.這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
2.在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。
注意:對於這一層面的封裝(隱藏),我們需要在類中定義乙個函式(介面函式)在它內部訪問被隱藏的屬性,然後外部就可以使用了
這種變形需要注意的問題是:
1.這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如a._a__n
>>> a=a()
>>> a._a__n
>>> a._a__x
>>> 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
python封裝與繼承
封裝步驟 1.屬性私有化,name 2.設定set和get方法,set name get name 3.新增安全條件判斷,引數型別判斷,取值範圍判斷 class dog object def init self legnum self.legnum legnum def set legnum sel...
Python繼承,封裝,多型
1.面向過程和物件導向 class 類名 類體 屬性和方法 2.建立物件 引用 變數 類名 init self 建構函式 3.方法 類方法 物件方法 4.物件導向的三大特性 繼承 封裝 多型 class 子類 派生類 父類 超類 基類 class a object def a pass pass c...
python 類 封裝 繼承 多型
類由一系列函式物件組成,在類中,函式物件稱為方法,方法的第乙個引數必須為self,表示當前例項物件 可把類理解為乙個dict,key為方法名 string型別 value為方法 class animal object def init self,age,color self.age age self...