日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python(23)-面向对象2-继承,多态

發(fā)布時間:2023/12/13 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+=1

Python中的屬性獲取機制
變量.屬性名 在屬性值的獲取中,使用向上查找機制。
類屬性的訪問:

類名.類屬性名

類創(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-继承,多态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。