Python 23 物件導向2 繼承,多型

2021-09-26 01:31:22 字數 3716 閱讀 2204

3.多繼承

4.新式類和舊式類

5.多型基本概念

6.類屬性、類方法-@classmethod

7.靜態方法@staticmethod

8.案例分析

物件導向三大特性:封裝(定義類的準則)、繼承(實現**的重用)、多型(增加**的靈活度)

繼承 實現**的重複的使用,將多個類的共有方法封裝在父類中,個性類從父親類中繼承共有方法,再封裝自己獨特的方法就行。

概念:子類擁有父類的所有屬性和方法,不需要再次開發,子類要做的就是根據自己的職責,封裝特有的屬性和方法。

語法:

class 子類名(父類名):

pass

專業術語:子類(派生類)、父類(基類)、繼承(派生)

繼承的特性:傳遞性,子類繼承了父類及其父類的父類的所有公有屬性和公有方法。

子類物件不能直接訪問父類的私有屬性和私有方法

子類物件需要通過 父類 的公有方法間接呼叫父類的 私有屬性 和 私有方法

子類繼承自父類,父類的方法不能滿足 子類方法 的要求,就需要在子類中對父類方法進行重新編寫。

具體實現:在子類中定義乙個和父類名字一樣的方法,寫上需要實現的功能就可以了。

如果子類重寫父類方法,在呼叫時,會呼叫子類重寫的方法

子類的方法實現 需要 在父類方法的基礎上 進行擴充套件。

具體實現:在子類中重寫父類方法,在需要的位置使用super().父類方法執行父親類方法的功能,**的其他位置,針對子類的需求,編寫子類特有的**實現。

super()是乙個特殊的類,用來重寫父類方法時,呼叫在父類中封裝的方法實現

python3.x 使用 super().父親類方法名

python2.x 使用 super(子類名, self).父類方法名

python2.0早期版本中沒有super()這個類,需要呼叫父類的方法,需要用父類名.方法(self)

在3.0中支援這種方法,但是不推薦使用父類名.方法(selg)的呼叫方式。因為父類名改變,之後的呼叫需要全部替換,不夠優雅。

單繼承:子類有乙個父類

多繼承:子類有多個父類 ,即可以繼承多個父類的屬性和方法。

語法:

class 子類名(父類名1,父類名2)

注意事項:兩個父類中封裝的方法名相同,同名方法呼叫的順序沒那麼明顯。多個父類應該避免同名方法的情況,使程式更加簡單和易讀取。

python 中的mro-method resolution order-方法解決順序:在多繼承中判斷方法屬性的呼叫路徑。可以利用 類名.__mro__ 檢視方法的呼叫順序(雙下劃線)。

類名.__mro__

依照小括號中列的順序 依次 往後查詢所呼叫方法的順序(「object」所有python類的基類)。

「object」所有python類的基類,擁有自己的屬性和方法,這些屬性和方法以雙下劃線開頭和結尾內建屬性和方法(可以使用dir檢視對應的屬性和方法)

dir(物件名)

新式類:以 object 為基類的類,會有許多object封裝的內建屬性和方法。pyhon3.x會預設建立的類繼承至object 類

舊式類:不以object為基類的類,新式類與舊式類的方法搜尋順序是不同的。

python 2.x的版本,需要明示寫明繼承object。否者為舊式類

class a(object):

pass

養成乙個習慣:當乙個類沒有父類時,都讓它繼承至object類,確保這個類是新式類。

多型:不同的子類物件,呼叫相同的父類方法,產生不同的執行結果。

多型使用的兩個前提:繼承、對父類方法的重寫。

不同物件的屬性存放在不同的記憶體空間中,物件的方法與屬性的儲存方式不同。

乙個類在記憶體中建立的多個物件的方法在記憶體中只有乙份,在呼叫方法時,將 呼叫方法的 物件的引用 傳遞給方法的self 引數,那麼self就可以通過物件引用來獲取物件屬性

=》物件記憶體空間中儲存該物件的屬性

=》類的儲存空間中儲存各個物件的方法

物件被建立之後,記憶體中就只有乙個物件的實實在在的存在–例項

物件=例項、建立物件=例項化

類是乙個特殊的物件,定義乙個類 就等於 建立了乙個類物件。由類物件 建立的物件 稱為 例項物件。類物件有自己的屬性和方法:類屬性和類方法。

此前所說的方法和屬性都屬於例項方法和屬性,下面介紹的是類屬性和類方法,以及靜態方法。

例如:記錄這個類建立了多少類物件,每個物件建立時會自動呼叫__init__方法,那麼在初始化方法中改變計數器的值,就能知道這個類建立了多少物件。

屬性名=屬性值

class tool(object):

num=0

def __init__(self,name):

self.name=name

tool.num+=1

python中的屬性獲取機制

變數.屬性名 在屬性值的獲取中,使用向上查詢機制。

類屬性的訪問:

類名.類屬性名

類建立的物件名.類屬性名

推薦使用類名訪問方式,避免和物件屬性的混淆現象,可能會造成在物件外為物件新增乙個屬性的混淆。

定義類方法

class

tool

(object):

num=

0@classmethod

defshow_tool_count

(cls)

:print

("工具物件的數量%d"

%cls.num)

def__init__

(self,name)

: self.name=name

tool.num+=

1

類名.方法名 就能呼叫該方法。(不用例項化該物件?)

在開發程式時,要在類中封裝方法,這個方法可以為類方法,也可以為例項方法

要訪問例項屬性的方法–例項方法

要訪問類屬性的方法–類方法

如果乙個方法既不需要訪問例項屬性,也不需要訪問例項方法,那麼這個方法可以封裝為靜態方法

靜態方法不需要傳遞第乙個引數(self,cls),通過類名.方法名來呼叫方法(不需要建立物件就能呼叫靜態方法)

class

dog(

object):

@staticmethod

defrun()

:print

("小狗要跑步。。"

)dog.run(

)

要求:開發乙個遊戲類

屬性:歷史最高分(類屬性)、玩家姓名(例項屬性)

方法:顯示幫助資訊–靜態方法

顯示歷史最高分–類屬性

開始當前玩家的遊戲–例項方法

例項屬性+類屬性=》定義例項方法

Python高階 相容Python2 3

第一種也是最重要的方法,就是匯入future模組。它可以幫你在python2中匯入python3的功能。上下文管理器是python2.6 引入的新特性,如果你想在python2.5中使用它可以這樣做 from future import with statement 在python3中print已經...

python 面向繼承物件 繼承

1.python物件導向的繼承指的是多個類之間的所屬關係,即預設繼承父類的所有屬性和方法。2.注意 當乙個類有多個父類的時候,預設使用第乙個父類的同名屬性和方法。3.檢視某個類的繼承關係 物件.mro 4.子類呼叫父類的同名方法和屬性 class a object definit self self...

Python3物件導向 2 繼承(2)

擴充套件內建物件 向內建型別新增新功能是繼承關係的有趣應用。class contactlist list defsearch self,name 返回所有符合名字的類 matching contacts for contact in self if name in contact.name retu...