Python 面向?qū)ο缶幊痰娜筇匦灾^承
Python 面向?qū)ο缶幊痰娜筇匦灾^承
一、繼承
- 繼承也是面向?qū)ο缶幊倘筇匦灾?/li>
- 繼承是類與類的一種
關(guān)系
- 定義一個新的 class 時,可以從某個
現(xiàn)有
的 class 繼承 - 新的 class 類就叫
子類(Subclass
) - 被繼承的類一般稱為
父類
、基類
、超類
- 通俗理解:子類與父類的關(guān)系,即爸爸與兒子,爸爸有了個兒子,兒子繼承爸爸的屬性和方法,爸爸的爸爸就是爺爺...以此類推
1、繼承的實際栗子
- 貓、狗都是動物,所以
動物是父類
,貓、狗是動物的子類
- 小菠蘿、大菠蘿都是人類,所以人類是父類,小
菠蘿、大菠蘿是人類的子類
- 動物、人類都是生物,所以生物是父類,
動物、人類是生物的子類
- 那么一般稱生物類是貓、狗、小菠蘿、大菠蘿的
超類、祖父類
2、繼承的好處
- 實現(xiàn)代碼的重用,相同的代碼不需要重復(fù)編寫
- 子類
擁有
父類的所有屬性、方法,提高了代碼的可擴展性和重用性 - 在子類繼承父類的同時,也可以
重新定義
某些屬性,并重寫
某些方法,即覆蓋
父類的屬性、方法,變成子類獨有的屬性、方法 - 子類也可以添加新的屬性、方法
3、繼承的使用場景
- 假如我需要定義幾個類,而類與類之間有一些
公共的
屬性和方法 - 可以把
公共的
屬性和方法提取作為父類(基類)的屬性、方法,而特殊的屬性、方法則在本類中定義 - 比如貓、狗都有吃喝拉撒四種行為,這些就是公共方法;但只有貓會喵喵叫,只有狗會汪汪叫,這些就是特殊方法
具體可以看下面的【不使用繼承、使用繼承的區(qū)別】
4、繼承有幾種?
單繼承
多繼承
5、Python 中繼承的簡單語法
class Parent: pass class Child(Parent): pass
有個重點:
所有類的都有一個共同父類
,就是 object,默認會繼承它,寫或不寫都一樣
class Parent: pass class Parent(object): pass
二、不使用繼承、使用繼承的區(qū)別
1、需求背景
有一個動物類、狗類、貓類
- 動物類有吃、喝、跑方法
- 狗類有吃、喝、跑、汪汪叫方法
- 貓類有吃、喝、跑、喵喵叫方法
2、不使用繼承
類圖
需求分析
- 每個類都擁有自己的方法
- 他們都擁有吃、喝、拉方法,且功能一樣
實際代碼:
# 不使用繼承 class Animal: def eat(self): print("吃東西...") def drink(self): print("喝水...") def run(self): print("跑步...") class Cat: def eat(self): print("吃東西...") def drink(self): print("喝水...") def run(self): print("跑步...") def miao(self): print("喵喵叫...") class Dog: def eat(self): print("吃東西...") def drink(self): print("喝水...") def run(self): print("跑步...") def wang(self): print("汪汪叫...")
這樣寫有什么問題?
- 三個類,需要
重復(fù)
寫三次吃、喝、跑的方法 - 假設(shè)此時需要修改 吃 方法的代碼,那么還得同步修改三個類的 吃 方法,屬于不必要的重復(fù)性工作
- 使用繼承可以大大減少開發(fā)工作量
2、使用繼承
類圖
從類圖就能看到,使用繼承就變得簡單多了
需求分析
- 提取三個類的公共方法,吃、喝、跑,然后抽象成動物類
- 所以動物類是一個父類,狗類、貓類繼承它
實際代碼:
# 使用繼承 class Animal: def eat(self): print("吃東西...") def drink(self): print("喝水...") def run(self): print("跑步...") class Cat(Animal): def miao(self): print("喵喵叫...") class Dog(Animal): def wang(self): print("汪汪叫...")
優(yōu)勢:
- 子類繼承父類,可以直接享受父類已經(jīng)封裝好的方法,不再需要自己開發(fā)一次
- 子類可以根據(jù)自身的需要,封裝子類獨有的屬性、方法,比如貓類的喵喵叫,狗類的汪汪叫
專業(yè)術(shù)語總結(jié)
- Dog 類是 Animale 類的子類,Animal 類是 Dog 類的父類,Dog 類從 Animal 類繼承
- Dog 類是 Animale 類的派生類,Animal 類是 Dog 類的基類,Dog 類從 Animal 類派生
三、繼承的傳遞性
1、什么是傳遞性
通俗來講
- C 類從 B 類繼承,B 類又從 A 類繼承
- 那么 C 類會擁有 A、B 類的所有屬性和方法
官方來講
- 子類擁有父類以及父類的父類,以及所有父類的父類的父類...中封裝的所有屬性、方法
實際栗子:
- 還是拿上面的動物類、狗類、貓類繼續(xù)展開講
- 假設(shè)此時有一個新的類叫柴犬類,繼承于狗類,有獨有的方法搖尾巴
類圖
實際代碼:
class Animal: def eat(self): print("吃東西...") def drink(self): print("喝水...") def run(self): print("跑步...") class Cat(Animal): def miao(self): print("喵喵叫...") class Dog(Animal): def wang(self): print("汪汪叫...") class Chai(Dog): def shake(self): print("小柴柴搖尾巴...") chai = Chai() # 調(diào)用 父類的父類 的方法 chai.eat() # 調(diào)用 父類 的方法 chai.wang() # 調(diào)用 自己獨有 的方法 chai.shake() # 輸出結(jié)果 吃東西... 汪汪叫... 小柴柴搖尾巴...
- Chai 類擁有 Dog 類、Animal 類所有屬性、方法
- 但它不會擁有 Cat 類的屬性、方法,因為他們沒有繼承關(guān)系
四、繼承和抽象
抽象即抽取類似或者說比較像的部分
小栗子:
- 從小菠蘿、小韻韻兩個對象中,抽取公共部分抽象成父類
- 再從人,豬,狗這三個類,抽取公共部分抽象成父類
1、繼承的重點
- 是基于抽象的結(jié)果,通過編程語言去實現(xiàn)它
- 先經(jīng)歷抽象這個過程,才能通過繼承的方式去
表達出抽象的結(jié)構(gòu)
- 抽象只是分析和設(shè)計的過程中,一個動作或者說一個技巧,通過抽象得到一個類
代碼栗子:
class Animal: def __init__(self, name, age, sex): self.__name = name self.__age = age self.__sex = sex # 提取的公共方法 def eat(self): print(f"{self.__name} 正在吃飯....") @property def name(self): return self.__name class Person(Animal): def walk(self): print(f"{self.name} 兩條腿正在走路") class Pig(Animal): def kill(self): print(f"{self.name} 豬正在去屠宰場ing...") class Dog(Animal): def wang(self): print(f"{self.name} 汪汪叫ing...") person = Person("小菠蘿", 25, "Male") pig = Pig("麥兜", 4, "公") dog = Dog("柴犬", 3, "母") # 調(diào)用父類的公共方法 person.eat() pig.eat() dog.eat() # 調(diào)用子類獨有的方法 person.walk() pig.kill() dog.wang() # 輸出結(jié)果 小菠蘿 正在吃飯.... 麥兜 正在吃飯.... 柴犬 正在吃飯.... 小菠蘿 兩條腿正在走路 麥兜 豬正在去屠宰場ing... 柴犬 汪汪叫ing...
以上就是Python 面向?qū)ο缶幊痰娜筇匦灾^承的詳細內(nèi)容,更多關(guān)于Python 面向?qū)ο缶幊痰睦^承的資料請關(guān)注腳本之家其它相關(guān)文章!希望大家以后多多支持腳本之家!
相關(guān)文章
使用Django搭建網(wǎng)站實現(xiàn)商品分頁功能
這篇文章主要介紹了使用Django搭建網(wǎng)站實現(xiàn)商品分頁功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-05-05Python標準庫內(nèi)置函數(shù)complex介紹
這篇文章主要介紹了Python標準庫內(nèi)置函數(shù)complex介紹,本文先是講解了complex的作用和使用注意,然后給出了使用示例,需要的朋友可以參考下2014-11-11Python Requests.post()請求失敗時的retry設(shè)置方式
這篇文章主要介紹了Python Requests.post()請求失敗時的retry設(shè)置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08