Python(23)-面向对象2-继承,多态
面向對象基本概念2--繼承、多態(tài)
- 1.繼承基本概念
- 2.子類重寫父類方法
- 2.1完全重寫
- 2.2擴展父類方法--super()
- 3.多繼承
- 4.新式類和舊式類
- 5.多態(tài)基本概念
- 6.類屬性、類方法-@classmethod
- 6.1類屬性
- 6.2類方法@classmethod
- 7.靜態(tài)方法@staticmethod
- 8.案例分析
本系列博文來自學習《Python基礎視頻教程》筆記整理,視屏教程連接地址:http://yun.itheima.com/course/273.html
面向對象三大特性:封裝(定義類的準則)、繼承(實現代碼的重用)、多態(tài)(增加代碼的靈活度)
1.繼承基本概念
繼承 實現代碼的重復的使用,將多個類的共有方法封裝在父類中,個性類從父親類中繼承共有方法,再封裝自己獨特的方法就行。
概念:子類擁有父類的所有屬性和方法,不需要再次開發(fā),子類要做的就是根據自己的職責,封裝特有的屬性和方法。
語法:
class 子類名(父類名):
pass
專業(yè)術語:子類(派生類)、父類(基類)、繼承(派生)
繼承的特性:傳遞性,子類繼承了父類及其父類的父類的所有公有屬性和公有方法。
子類對象不能直接訪問父類的私有屬性和私有方法
子類對象需要通過 父類 的公有方法 間接調用父類的 私有屬性 和 私有方法
2.子類重寫父類方法
2.1完全重寫
子類繼承自父類,父類的方法不能滿足 子類方法 的要求,就需要在子類中對父類方法進行重新編寫。
具體實現:在子類中定義一個和父類名字一樣的方法,寫上需要實現的功能就可以了。
如果子類重寫父類方法,在調用時,會調用子類重寫的方法
2.2擴展父類方法–super()
子類的方法實現 需要 在父類方法的基礎上 進行擴展。
具體實現:在子類中重寫父類方法,在需要的位置使用super().父類方法執(zhí)行父親類方法的功能,代碼的其他位置,針對子類的需求,編寫子類特有的代碼實現。
super()是一個特殊的類,用來重寫父類方法時,調用在父類中封裝的方法實現
Python3.x 使用 super().父親類方法名
Python2.x 使用 super(子類名, self).父類方法名
Python2.0早期版本中沒有super()這個類,需要調用父類的方法,需要用父類名.方法(self)
在3.0中支持這種方法,但是不推薦使用父類名.方法(selg)的調用方式。因為父類名改變,之后的調用需要全部替換,不夠優(yōu)雅。
3.多繼承
單繼承:子類有一個父類
多繼承:子類有多個父類 ,即可以繼承多個父類的屬性和方法。
語法:
class 子類名(父類名1,父類名2)
注意事項:兩個父類中封裝的方法名相同,同名方法調用的順序沒那么明顯。多個父類應該避免同名方法的情況,使程序更加簡單和易讀取。
python 中的MRO-method resolution order-方法解決順序:在多繼承中判斷方法屬性的調用路徑??梢岳?類名.__mro__ 查看方法的調用順序(雙下劃線)。
類名.__mro__
依照小括號中列的順序 依次 往后查找所調用方法的順序(“object”所有Python類的基類)。
4.新式類和舊式類
“object”所有Python類的基類,擁有自己的屬性和方法,這些屬性和方法以雙下劃線開頭和結尾內置屬性和方法(可以使用dir查看對應的屬性和方法)
dir(對象名)
新式類:以 object 為基類的類,會有許多object封裝的內置屬性和方法。pyhon3.x會默認創(chuàng)建的類繼承至object 類
舊式類:不以object為基類的類,新式類與舊式類的方法搜索順序是不同的。
python 2.x的版本,需要明示寫明繼承object。否者為舊式類
class A(object):
pass
養(yǎng)成一個習慣:當一個類沒有父類時,都讓它繼承至object類,確保這個類是新式類。
5.多態(tài)基本概念
多態(tài):不同的子類對象,調用相同的父類方法,產生不同的執(zhí)行結果。
多態(tài)使用的兩個前提:繼承、對父類方法的重寫。
不同對象的屬性存放在不同的內存空間中,對象的方法與屬性的存儲方式不同。
一個類在內存中創(chuàng)建的多個對象的方法在內存中只有一份,在調用方法時,將 調用方法的 對象的引用 傳遞給方法的self 參數,那么self就可以通過對象引用來獲取對象屬性。
=》對象內存空間中存儲該對象的屬性
=》類的存儲空間中存儲各個對象的方法
對象被創(chuàng)建之后,內存中就只有一個對象的實實在在的存在–實例
對象=實例、創(chuàng)建對象=實例化
類是一個特殊的對象,定義一個類 就等于 創(chuàng)建了一個類對象。由類對象 創(chuàng)建的對象 稱為 實例對象。類對象有自己的屬性和方法:類屬性和類方法。
6.類屬性、類方法-@classmethod
此前所說的方法和屬性都屬于實例方法和屬性,下面介紹的是類屬性和類方法,以及靜態(tài)方法。
6.1類屬性
例如:記錄這個類創(chuàng)建了多少類對象,每個對象創(chuàng)建時會自動調用__init__方法,那么在初始化方法中改變計數器的值,就能知道這個類創(chuàng)建了多少對象。
屬性名=屬性值
class Tool(object):num=0def __init__(self,name):self.name=nameTool.num+=1Python中的屬性獲取機制
變量.屬性名 在屬性值的獲取中,使用向上查找機制。
類屬性的訪問:
類名.類屬性名
類創(chuàng)建的對象名.類屬性名
推薦使用類名訪問方式,避免和對象屬性的混淆現象,可能會造成在對象外為對象添加一個屬性的混淆。
6.2類方法@classmethod
定義類方法
class Tool(object):num=0@classmethoddef show_tool_count(cls):print("工具對象的數量%d"%cls.num)def __init__(self,name):self.name=nameTool.num+=1類名.方法名 就能調用該方法。(不用實例化該對象?)
7.靜態(tài)方法@staticmethod
在開發(fā)程序時,要在類中封裝方法,這個方法可以為類方法,也可以為實例方法
要訪問實例屬性的方法–實例方法
要訪問類屬性的方法–類方法
如果一個方法既不需要訪問實例屬性,也不需要訪問實例方法,那么這個方法可以封裝為靜態(tài)方法。
靜態(tài)方法不需要傳遞第一個參數(self,cls),通過類名.方法名來調用方法(不需要創(chuàng)建對象就能調用靜態(tài)方法)
class Dog(object):@staticmethoddef run():print("小狗要跑步。。") Dog.run()8.案例分析
要求:開發(fā)一個游戲類
屬性:歷史最高分(類屬性)、玩家姓名(實例屬性)
方法:
顯示幫助信息–靜態(tài)方法
顯示歷史最高分–類屬性
開始當前玩家的游戲–實例方法
實例屬性+類屬性=》定義實例方法
總結
以上是生活随笔為你收集整理的Python(23)-面向对象2-继承,多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据学习(06)-- 云数据库
- 下一篇: 算法(2)-二叉树的遍历(递归/迭代)p