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):養成乙個習慣:當乙個類沒有父類時,都讓它繼承至object類,確保這個類是新式類。pass
多型:不同的子類物件,呼叫相同的父類方法,產生不同的執行結果。
多型使用的兩個前提:繼承、對父類方法的重寫。
不同物件的屬性存放在不同的記憶體空間中,物件的方法與屬性的儲存方式不同。
乙個類在記憶體中建立的多個物件的方法在記憶體中只有乙份,在呼叫方法時,將 呼叫方法的 物件的引用 傳遞給方法的self 引數,那麼self就可以通過物件引用來獲取物件屬性。
=》物件記憶體空間中儲存該物件的屬性
=》類的儲存空間中儲存各個物件的方法
物件被建立之後,記憶體中就只有乙個物件的實實在在的存在–例項
物件=例項、建立物件=例項化
類是乙個特殊的物件,定義乙個類 就等於 建立了乙個類物件。由類物件 建立的物件 稱為 例項物件。類物件有自己的屬性和方法:類屬性和類方法。
此前所說的方法和屬性都屬於例項方法和屬性,下面介紹的是類屬性和類方法,以及靜態方法。
例如:記錄這個類建立了多少類物件,每個物件建立時會自動呼叫__init__方法,那麼在初始化方法中改變計數器的值,就能知道這個類建立了多少物件。
屬性名=屬性值python中的屬性獲取機制class tool(object):
num=0
def __init__(self,name):
self.name=name
tool.num+=1
變數.屬性名 在屬性值的獲取中,使用向上查詢機制。
類屬性的訪問:
類名.類屬性名類建立的物件名.類屬性名推薦使用類名訪問方式,避免和物件屬性的混淆現象,可能會造成在物件外為物件新增乙個屬性的混淆。定義類方法
類名.方法名 就能呼叫該方法。(不用例項化該物件?)class
tool
(object):
num=
0@classmethod
defshow_tool_count
(cls)
("工具物件的數量%d"
%cls.num)
def__init__
(self,name)
: self.name=name
tool.num+=
1
在開發程式時,要在類中封裝方法,這個方法可以為類方法,也可以為例項方法
要訪問例項屬性的方法–例項方法
要訪問類屬性的方法–類方法
如果乙個方法既不需要訪問例項屬性,也不需要訪問例項方法,那麼這個方法可以封裝為靜態方法。
靜態方法不需要傳遞第乙個引數(self,cls),通過類名.方法名來呼叫方法(不需要建立物件就能呼叫靜態方法)
要求:開發乙個遊戲類class
dog(
object):
@staticmethod
defrun()
("小狗要跑步。。"
)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...