Python中的繼承和多型
導讀 | 本文以生活中的基礎現象為切入點,主要介紹了Python基礎中繼承和多型,包括單繼承、多繼承的語法、多型常見的 “鴨子型別”、 以及如何重寫父類的方法都做了詳細的講解。 |
繼承是一種建立新的類的方式,新建立的叫子類,繼承的叫父類、超類、基類。繼承的特點就是子類可以使用父類的屬性(特徵、技能)。繼承是類與類之間的關係。
繼承可以減少程式碼冗餘、提高重用性。
在現實生活中,繼承一般指的是子女繼承父輩的財產,如下圖:
Class 派生類名(基類名):#基類名寫在括號裡。
在繼承關係中,已有的,設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
在繼承中基類的建構函式(init()方法)不會被自動呼叫,它需要在其派生類的構造中親自專門呼叫。
如果需要在派生類中呼叫基類的方法時,透過“基類名.方法名()”的方法來實現,需要加上基類的類名字首,且需要帶上self引數變數。區別於在類中呼叫普通函式時並不需要帶上self 引數。也可以使用內建函式super()實現這一目的。
Python總是首先查詢對應型別的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查詢(先在本類查詢呼叫的方法,找不到才去基類中找)。
例:
class Animal: #父類 def eat(self): print("-----吃-----") def drink(self): print("-----喝-----") class Dog(Animal): #子類繼承父類 """ def eat(self): print("-----吃-----") def drink(self): print("-----喝-----") """ pass class Cat: pass wang_cai = Dog() wang_cai.eat() wang_cai.drink()
執行結果:
多層繼承
例:
class Animal: def eat(self): print("-----吃-----") def drink(self): print("-----喝-----") class Dog(Animal): def bark(self): print("-----汪汪叫------") class XTQ(Dog): """定義了一個哮天犬 類""" pass class Cat(Animal): def catch(self): print("----捉老鼠----") xtq = XTQ() xtq.eat() xtq.bark()
執行結果:
重寫父類方法
例:
class Animal: #父類 def eat(self): print("-----吃-----") def drink(self): print("-----喝-----") class Dog(Animal): def bark(self): print("-----汪汪叫------") class XTQ(Dog): #重寫Dog方法 """定義了一個哮天犬 類""" def bark(self): print("----嗷嗷叫-----") class Cat(Animal): def catch(self): print("----捉老鼠----") xtq = XTQ() xtq.eat() xtq.bark()
執行結果:
從圖中能夠看出,所謂多繼承,即子類有多個父類,並且具有它們的特徵。
Python中多繼承的格式如下:
# 定義一個父類 class A: def printA(self): print('----A----') # 定義一個父類 class B: def printB(self): print('----B----') # 定義一個子類,繼承自A、B class C(A,B): def printC(self): print('----C----') obj_C = C() obj_C.printA() obj_C.printB()
執行結果:
----A---- ----B----
Python中是可以多繼承的,父類中的方法、屬性,子類會繼承。
想一想:
如果在上面的多繼承例子中,如果父類A和父類B中,有一個同名的方法,那麼透過子類去呼叫的時候,呼叫哪個?
#coding=utf-8 class base(object): def test(self): print('----base test----') class A(base): def test(self): print('----A test----') # 定義一個父類 class B(base): def test(self): print('----B test----') # 定義一個子類,繼承自A、B class C(A,B): pass obj_C = C() obj_C.test() print(C.__mro__) #可以檢視C類的物件搜尋方法時的先後順序
執行結果:
多型的概念是應用於Java和C#這一類強型別語言中,而Python崇尚“鴨子型別”。
所謂多型:定義時的型別和執行時的型別不一樣,此時就成為多型。
Python虛擬碼實現Java或C#的多型。
Python “鴨子型別”
class Duck: def quack(self): print("Quaaaaaack!") class Bird: def quack(self): print("bird imitate duck.") class Doge: def quack(self): print("doge imitate duck.") def in_the_forest(duck): duck.quack() duck = Duck() bird = Bird() doge = Doge() for x in [duck, bird, doge]: in_the_forest(x)
執行結果:
本文以生活中的基礎現象為切入點,主要介紹了Python基礎中繼承和多型,包括單繼承、多繼承的語法、多型常見的 “鴨子型別”、 以及如何重寫父類的方法都做了詳細的講解。
用豐富的案例幫助大家更好理解,使用Python程式語言,方便大家更好理解,希望對大家的學習有幫助。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2775468/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python 繼承 和 多型Python繼承多型
- 多型和繼承多型繼承
- OOP的多型和繼承OOP多型繼承
- C#中繼承和多型的研究C#中繼繼承多型
- 封裝、繼承和多型封裝繼承多型
- Java中的類繼承與多型Java繼承多型
- python極簡教程07:封裝、多型和繼承Python封裝多型繼承
- 實驗五 繼承和多型繼承多型
- 實驗5 繼承和多型繼承多型
- 繼承與多型繼承多型
- Python 簡明教程 --- 21,Python 繼承與多型Python繼承多型
- JavaScript 的繼承與多型JavaScript繼承多型
- Javascript的繼承與多型JavaScript繼承多型
- [c++] 繼承和多型整理二C++繼承多型
- 太極1:繼承和多型2繼承多型
- 這樣理解,java繼承中多型的屬性和方法Java繼承多型
- go語言中的封裝,繼承和多型Go封裝繼承多型
- java繼承與多型Java繼承多型
- 詳細介紹Python類的繼承與多型Python繼承多型
- python 基礎之繼承、重寫、多繼承Python繼承
- 聊聊iOS中的多繼承和多重代理iOS繼承
- 『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員Python物件繼承
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- Cris 的 Scala 筆記整理(八):物件導向中級-繼承和多型筆記物件繼承多型
- 多繼承 與 多重繼承繼承
- python:super()對多繼承的影響Python繼承
- JS中的多種繼承方式JS繼承
- 多繼承繼承
- aardio 實現封裝繼承多型封裝繼承多型
- C語言實現繼承多型C語言繼承多型
- 面向2-封裝、繼承、多型封裝繼承多型
- Java的三大特性:封裝、繼承、多型Java封裝繼承多型
- Go語言封裝、繼承、介面、多型和斷言的案例Go封裝繼承多型
- Java抽象類、繼承及多型和介面卡的實現Java抽象繼承多型
- 如何理解Python中的繼承?python入門Python繼承
- 【Python】python類的繼承Python繼承
- python繼承Python繼承
- python 繼承Python繼承