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

2021-01-07 騰訊網

前言

面向對象是所有高級語言(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 派生類名(基類名): #基類名寫在括號裡派生類成員在繼承關係中,已有的,設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
  • C語言中的面向對象(1)-類模擬和多態,繼承
    正在閱讀:C語言中的面向對象(1)-類模擬和多態,繼承C語言中的面向對象(1)-類模擬和多態,繼承2005-01-12 10:04出處:作者:liyuming1978>   在面向對象的語言裡面,出現了類的概念。這是編程思想的一種進化。所謂類:是對特定數據的特定操作的集合體。所以說類包含了兩個範疇:數據和操作。而C語言中的struct僅僅是數據的集合。
  • 淺析 Python 的類、繼承和多態
    這兩者都是對象的字符串形式的表示,但還是有點差別的。簡單來說,repr() 的結果面向的是解釋器,通常都是合法的 Python 代碼,比如 Point(10, 10);而 str() 的結果面向用戶,更簡潔,比如 (10, 10)。
  • Python零基礎入門教程,面向對象有哪三大特性?
    大綱(面向對象的三大特性)封裝性繼承性多態性封裝性封裝隱藏了對象的屬性和方法內部實現細節,僅對外提供公共訪問方式,類的內部可以訪問,外部不可以訪問。外部訪問私有變量或者私有方法報錯繼承性現實生活中狗與動物之間的關係,狗具有動物的全部特徵和行為,在面向對象中動物被稱為「父類」,狗被稱為「子類
  • 黑馬程式設計師:Python封裝、繼承和多態以及類方法等習題
    習題總結:本文的習題繼續面向對象編程的知識點,包括面向對象的三大特徵,圍繞類屬性和實例屬性,還有類的方法和靜態方法。通過本章內容的學習複習,大家對面向對象應該會有比較深入的了解了。為以後的開發奠定好紮實的面向對象編程思想。如果有需要答案的小夥伴依舊是轉發後評論獲取。
  • Python類的概念、定義、屬性、繼承
    1.面向對象(Object Oriented,OO)概念面向對象,是我們編程的一種思維。早期的計算機編程是基於面向過程的方法,例如實現算術運算1+1+2 = 4,通過設計一個算法就可以解決當時的問題。隨著計算機技術的不斷提高,計算機被用於解決越來越複雜的問題。通過面向對象的方式,將現實世界的事物抽象成對象,現實世界中的關係抽象成類、繼承。
  • Python中類和類的實例化、私有屬性面,以及面向對象的三大屬性
    類的定義2.類的屬性屬性的本質就是變量。如果要從新修改類屬性,以上代碼為列,可以用從新賦值的方法進行操作,即:dog.eye=4,這樣就完成了從新賦值的修改操作。3.私有化對於Python中的類屬性,可以通過雙下劃線」__」來實現一定程度的私有化。「 _」和「 __」的使用 更多的是一種規範/約定,沒有真正達到限制的目的。「_」:以單下劃線開頭只能允許其本身與子類進行訪問,(起到一個保護的作用)。
  • python面向對象三大特徵
    大概所有變成初學者初學者最頭疼的第一道坎就是面向對象的理解封裝從封裝本身去理解 就是把小貓小狗用袋子裝起來,然後把袋子的小口封上私有化方法:方法的私有化可以保護好一些核心的代碼,可以添加條件,是別人不能不滿足條件的更改,進行代碼的保護,python
  • 從零入門量化交易系列-python的面向對象
    1、面向對象基礎概念類(Class): 用來描述具有相同屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。
  • 如何理解python中的類和對象?
    答案就是它們有一些共同的屬性特徵,根據我們制定的分類方法,就可以將它們進行分類了,分類的準則不同,它們也可以屬於不同的類。在我們的python編程中,也是有類和對象的,比如我們知道的數據類型就可以看做是類,數字類,字符類,列表類,函數類;實際的1,2,3數字就是數字對象了,"abc"等就是字符對象了,這些都是python中提供的對象。
  • 可能是最全的Python面向對象入門教程了
    .html面向對象編程和函數式編程(面向過程編程)都是程序設計的方法,不過稍有區別。面向對象編程:1. 導入各種外部庫2. 設計各種全局變量3. 決定你要的類4. 給每個類提供完整的一組操作5. 明確地使用繼承來表現不同類之間的共同點6.
  • 史上最全 Python 面向對象編程
    面向對象編程:1. 導入各種外部庫2. 設計各種全局變量3. 決定你要的類4. 給每個類提供完整的一組操作5. 明確地使用繼承來表現不同類之間的共同點6. 根據需要,決定是否寫一個main函數作為程序入口面向對象編程中,將函數和變量進一步封裝成類,類才是程序的基本元素,它將數據和操作緊密地連結在一起,並保護數據不會被外界的函數意外地改變。類和和類的實例(也稱對象)是面向對象的核心概念,是和面向過程編程、函數式編程的根本區別。
  • C中的繼承和多態
    有了繼承和多態,我們可以完成代碼重用。在C中有許多技巧可以實現多態。本文的目的就是演示一種簡單和容易的技術,在C中應用繼承和多態。通過創建一個VTable(virtual table)和在基類和派生類對象之間提供正確的訪問,我們能在C中實現繼承和多態。VTable能通過維護一張函數表指針表來實現。為了提供基類和派生類對象之間的訪問,我們可以在基類中維護派生類的引用和在派生類中維護基類的引用。
  • 淺析java繼承與多態,抽象類與接口的區別
    Java 是個純粹的面向對象語言,沒有過程式的寫法,所有操作都是基於對象。面向對象的設計可以更好的解決系統維護、擴展、和代碼重用的需求,代碼過多後過程式的邏輯組織會變得異常複雜,所以就發展出了面向對象式編程。而面向對象的基本特性就是封裝、繼承、與多態。
  • Python入門基礎之面向對象二:類和實例、方法
    前面一篇文章我介紹了python面向對象的基本知識,連結在最下面。初步解釋了面向對象和面向對象的優點,今天就開始正式用代碼來展現面向對象。1、利用class創建類Python中,創建類的語句是如下所示先解釋一下,class後面跟的是類名,括號裡面是基類(也成為父類)python3中默認繼承object。
  • python核心部分創建對象中各種名詞的定義及用法
    但是python被稱為面向對象的語言,所以創建對象才是python的核心部分,我們今天就走進python的核心部分-創建對象。接下來幾天的章節非常重要非常核心,非常重要非常核心,非常重要非常核心,重要的事情說是三次。首先說一下幾個名詞的定義,方便你在以後的學習中理解。
  • 面向對象的特徵和原則
    面向對象中的三個基本特徵:封裝、繼承和多態1、封裝,將現實中事物抽象成計算機領域中的對象,對象同時具有屬性和行為,這就是封裝。在封裝中,數據隱藏,對象只對外提供與其他對象交互的接口,把自身的一些屬性和實現細節對外是隱藏的。
  • Python類和對象-給你介紹個對象?
    ~~此對象非彼對象,面向對象(Object Oriented)是一種編程的思想,而不是一種程式語言,而Python也是支持面向對象的語言。面向對象的核心是抽象、繼承、多態。 在面向對象思想中,一切皆是對象,每個對象都有它的屬性個方法,每個對象都可以通過消息互相交互。
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。