【4】類的繼承和多態-簡易的Python面向對象教程

2021-01-15 騰訊網

前言

面向對象是所有高級語言(Python,Java,C++等)的基石,是重中之重。

這個文章系列的目的是通過簡單易懂的例子,深入淺出,讓Python學習者牢固的掌握Python面向對象的概念和方法。

本系列包括:

面向對象(1) - 屬性,構造方法,self關鍵詞。

面向對象(2) - 實例方法 (本文)

面向對象(3) - 類屬性和類方法

面向對象(4) - 繼承和多態,以及一個綜合小遊戲案例

類的繼承,父類,子類

看這張圖:

上面有一條小狗,代表了普通的狗。

下面有警犬,牧羊犬和寵物犬,他們都是狗。

但他們又有獨特的特點,具有額外的屬性或者技能。

警犬有偵探功能,所以有detect()方法,有額外的屬性ability,表示它的偵探能力等級。

牧羊犬有保護養的功能,所以有protect()方法,有額外的num_of_sheeps表示它可以保護幾隻羊。

寵物犬有唱歌的功能,所以有sing()方法,有額外的屬性price表示價格。

動物界具有天然的繼承關係,人類也是,我們一代代繼承下來。繼承了前輩們的屬性和能力,又發展了自己獨特的屬性和能力。

在圖中的例子,我們如何在程序中表示普通的狗,牧羊犬,警犬等呢?

我們可以把detect(), protect()等函數和屬性直接加在Dog裡面,但這並不合理,因為並不是所有的狗可以偵查,並不是所有的狗都可以保護養。

正確的作法是創建新的類,這些新的類繼承Dog類:

SheepDog 表示牧羊犬

PoliceDog 表示警犬

PetDog 表示寵物犬

在這裡Dog被稱為父類,SheepDog等被稱為子類

子類會自動擁有父類的屬性和方法,自己也可以添加自己的獨特屬性和方法。

子類的定義

現在來定義SheepDog。先看看我們原來的Dog類:

定義子類SheepDog

仔細閱讀上面的代碼,觀察它的特點:

聲明繼承關係

SheepDog(Dog)這種寫法:括號中的Dog表示Dog是SheepDog的父類。

我們定義Dog的時候沒有括號,表示它沒有父類(實際上它默認繼承了Object類)。

構造函數和super()方法

子類也有構造函數init方法,傳入各項必要的屬性。

構造函數的第一行調用父類的構造函數,因為牧羊犬首先也是一個Dog,所以要先構造一個Dog出來。

其中super()代表父類。我們用self表示自己,用super()表示父類。注意self是一個關鍵詞,是沒有括號的,super()是一個函數,是有括號的。

值得注意的是,使用self可以訪問父類的屬性和方法,因為父類的就是自己的。在構造函數中我們使用super()來調用父類的構造函數是因為子類和父類都有__init__方法,如果不適用super()就會調用自己的__init__方法,這種情況下需要用super)()來明確指定要訪問父類的方法。

第二行添加了牧羊犬的獨特屬性num_of_sheeps。這樣牧羊犬有4個屬性,其中3個屬性是繼承自父類的,一個是自己獨有的。

使用子類

子類的使用和父類是一樣的:

調用構造函數創建實例。

通過變量名訪問屬性。

通過變量名調用方法。注意bark()是父類的函數,子類可以直接使用。

給子類添加新的方法

我們給SheepDog添加它的獨特方法protect():

調用一下試試看:

覆蓋父類的方法

因為繼承的關係,SheepDog直接就有bark()方法,這是從父類繼承過來的。

假設牧羊犬的叫聲和普通叫聲是不一樣的,我們在子類中覆蓋父類中的方法:

這時候再調用bark()方法就會使用子類中定義的方法:

列印的結果是:

集成和覆蓋的用處舉例

類的繼承和對父類方法的覆蓋在代碼設計中很有用。假設有個程序的界面是這樣的:

按鈕就是一個類,比如叫做Button。

為了實現不同的皮膚,我們可以寫一個類繼承Button類,假設就叫做MyButton吧,子類自動擁有了父類的屬性和函數,但是我們可以覆蓋某些函數,讓他擁有不同的皮膚,甚至不同的行為。

Dog版本的吃雞遊戲

面向對象的核心知識到這裡就更新完了,最後奉上Dog版本的吃雞遊戲。這個遊戲包含兩個類:

其中dog.py定義了幾個狗類

game.py中創建100條Dog並讓他們互相攻擊,直到最後只有一隻為止。

dog.py

game.py

相關焦點

  • 面向對象特性之三:多態(Python進階教程)
    今天我們要講一講面向對象的第三個特性:多態;什麼叫做多態?從字面意思上理解,就是一個函數具有多種形態。本質上其實就是同一操作方法作用於不同的對象時,有著不同的解釋,執行不同的邏輯,產生不同的結果。今天我們還是用例子來說明在Python中多態的使用方法、注意事項和使用的優點。
  • python中類的繼承和多態
    繼承是為了代碼復用和設計復用而設計的,是面向對象程序設計的重要特徵之一。當我們設計一個新類時,如果可以繼承一個已有的設計良好的類然後進行二次開發,無疑會大幅度減少開發工作量。1.類的繼承類繼承語法:Class 派生類名(基類名): #基類名寫在括號裡派生類成員在繼承關係中,已有的,設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
  • Java面向對象之:封裝、繼承、多態
    Java面向對象之:封裝、繼承、多態高內聚和低耦合,父類只希望被子類訪問的欄位和方法時;繼承從面向對象的角度上說,繼承是一種從一般到特殊的關係,是一種「is a」的關係,即子類是對父類的拓展,是一種特殊的父類,比如:狗是動物的一種特殊情況,狗屬於動物;在這個例子中,動物是父類,狗是子類,狗繼承了動物的特徵和行為,並在動物的特徵和行為的基礎之上拓展自己的特徵和行為
  • Python零基礎入門教程,面向對象有哪三大特性?
    大綱(面向對象的三大特性)封裝性繼承性多態性封裝性封裝隱藏了對象的屬性和方法內部實現細節,僅對外提供公共訪問方式,類的內部可以訪問,外部不可以訪問。外部訪問私有變量或者私有方法報錯繼承性現實生活中狗與動物之間的關係,狗具有動物的全部特徵和行為,在面向對象中動物被稱為「父類」,狗被稱為「子類」。
  • 在.NET中,C#舉例深度理解面向對象編程中的封裝、繼承和多態
    什麼是面向對象編程?我們在沒有接觸類之前,所有的代碼都是堆在一起的,沒有面向對象的概念,但接觸了類/對象/繼承/接口之後,我們要建立自己的面向對象編程的概念,在編碼過程中,要讓自己編寫的程序是面向對象的,而不是堆代碼。微軟在.NET框架中推出的C#語言是面向對象的強類型程式語言。
  • 黑馬程式設計師:Python封裝、繼承和多態以及類方法等習題
    習題總結:本文的習題繼續面向對象編程的知識點,包括面向對象的三大特徵,圍繞類屬性和實例屬性,還有類的方法和靜態方法。通過本章內容的學習複習,大家對面向對象應該會有比較深入的了解了。為以後的開發奠定好紮實的面向對象編程思想。如果有需要答案的小夥伴依舊是轉發後評論獲取。
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。01不同子類之間的多態在前面我們說繼承的時候說到,子類可以繼承到父類的方法,繼承後可以對方法進行重寫。
  • 大牛級別程式設計師帶小白入門Python,花7天整理最全面向對象教程!
    Python作為人工智慧首選程式語言,也是最近大家知道比較火的程式語言,Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。下面有大牛級別程式設計師帶小白入門Python,花7天整理最全面向對象教程!供參考學習!
  • 跟我學java編程—面向對象編程多態概念的理解
    前面介紹了面向對象的繼承思想,繼承思想其核心是代碼的復用和程序功能高度的擴展性。繼承可以直接實現代碼的復用,功能的擴展性是指繼承後的類在父類的基礎上增加新的行為,或者對父類的行為進行擴展,實現同一個行為具有不同的實現代碼。
  • 淺析java繼承與多態,抽象類與接口的區別
    Java 是個純粹的面向對象語言,沒有過程式的寫法,所有操作都是基於對象。面向對象的設計可以更好的解決系統維護、擴展、和代碼重用的需求,代碼過多後過程式的邏輯組織會變得異常複雜,所以就發展出了面向對象式編程。而面向對象的基本特性就是封裝、繼承、與多態。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • Java中的面向對象三大特性之多態
    區分方法重寫和方法重載方法覆蓋(重寫)和方法重載是兩個極易混淆的概念,必須嚴格區分;方法覆蓋出現的前提條件之一是必須有繼承發生的情況下,而且要求父類和子類中的方法必須同原型;方法重載時,繼承並不是必需的,它只要求方法名稱相同,而參數列表則必須不同
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    各位讀者老爺們大家好鴨~圖圖又來了,今天我們要說一下「多態」。怎麼理解這兩個字呢?可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。
  • 面向對象的編程-多態「程式設計師培養之路第四十四天」
    在面向對象語言中,多態就是把子類對象賦值給父類引用,然後調用父類的方法,去執行子類覆蓋父類的那個方法。> public function work(){ echo "這個方法需要在子類具體實現"; } //從事何種工作 public function doWork($shenfen_obj){//通過傳入不同「身份」的對象
  • 如何給女朋友解釋什麼是面向對象編程?
    我們把「數據」和「能力」組合成一個對象的過程就叫做「封裝」。封裝的結果就是可以有一個類,通過這個類我們可以獲得一個對象。然後我們就可以通過給這個對象下命令,讓他執行自己的「能力」。除了把「數據」和「能力」封裝成一個「對象」更加方便使用以外,還有啥其他的特點麼?
  • opencv-python獲取圖像:面向對象與面向過程
    關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
  • 面向對象編程
    面向對象編程(OOP)對於初學者來說可能是一個很難理解的概念。很多書籍都是從解釋OOP開始,討論三大術語:封裝、繼承和多態性,但是解釋的效果往往讓人失望。本文希望讓程式設計師、數據科學家和python愛好者們更容易理解這個概念。我們去掉所有的行話,通過一些例子來做解說。這篇文章是關於解釋OOP的外行方式。
  • Java面向對象之接口——interface
    對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實現細節;在面向對象的思想中,可認為他們都是同一個類的不同實例,也就是說插槽是USB規範的實例。接口繼承語法如下:[修飾符] interface 接口名 extends 接口1,接口2類和類之間的繼承關係用extends關鍵字來表示,接口和接口之間也只能是繼承關係,也使用extends 關鍵字來表示。
  • Java多態性:Java什麼是多態?
    多態性是面向對象編程的又一個重要特徵,它是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義