「Python 」面向對象三大特性之繼承性(詳細講解)

面向對象三大特性:

1. 封裝:根據職責將屬性和方法封裝到一個抽象的類中

2. 繼承:實現代碼的重用,相同的代碼不需要重復的編寫

3. 多態:不同的對象調用相同的方法,產生不通過的執行結果,增加代碼的靈活度

一、問題的拋出——單純的封裝可能會出現很多重復的代碼

下面看一張圖,可以看出動物類,和狗類,還有哮天犬類都有很多重復的方法代碼,這樣大大降低了代碼的效率,產生很多重復的代碼,修改代碼也變得麻煩了起來。比如我要修改動物類的吃方法,那么狗類中的吃方法也要重復修改一遍很麻煩等情況,那么解決這個問題就可以用到面向對象中的繼承特性來解決。

圖片1.png

下面是不使用繼承的代碼:

class Animal():
    def eat(self):
        print("吃")

    def run(self):
        print("跑")

    def drink(self):
        print("喝")

    def sleep(self):
        print("睡")

class Dog():
    def eat(self):
        print("吃")

    def run(self):
        print("跑")

    def drink(self):
        print("喝")

    def sleep(self):
        print("睡")

    def bark(self):
        print("汪汪叫")

# 1\. 創建動物類對象 - 小花狗
huagou = Animal()
# 調用方法
huagou.eat()
huagou.run()
huagou.drink()
huagou.sleep()

# 2\. 創建狗類對象 - 斑點狗
bandia = Dog()
# 調用方法
bandia.eat()
bandia.run()
bandia.drink()
bandia.sleep()
bandia.bark()
圖片2.png

執行結果:

圖片3.png

二、繼承的概念、語法和特點

1)繼承的概念:

子類擁有父類的所有方法和屬性。

圖片4.png
圖片5.png

使用繼承后只需要把子類中特有的屬性和方法再次封裝一下就可以了,而不需要其他子類中把父類的方法重復編寫一遍。

2)繼承的語法:

class 類名(父類名):
    pass

3)特點:

1. 子類繼承自父類,可以直接享受父類中已經封裝好的方法,不需要再次開發

2. 子類中應該根據職責,封裝子類特有的屬性和方法

使用繼承修改上面的代碼:

class Animal():
    def eat(self):
        print("吃")

    def run(self):
        print("跑")

    def drink(self):
        print("喝")

    def sleep(self):
        print("睡")

class Dog(Animal):

    def bark(self):
        print("汪汪叫")

# 1\. 創建動物類對象 - 小花狗
huagou = Animal()
# 調用方法
huagou.eat()
huagou.run()
huagou.drink()
huagou.sleep()

# 2\. 創建狗類對象 - 斑點狗
bandia = Dog()
# 調用方法
bandia.eat()
bandia.run()
bandia.drink()
bandia.sleep()
bandia.bark()
圖片6.png

執行結果:依舊沒變

圖片7.png

三、繼承相關的術語——繼承和派生

專業術語:

Dog類是Animal類的子類,Animal類是Dog類的父類,Dog類從Animal類中繼承

Dog類是Animal類的派生類,Animal類是Dog類的基類,Dog類從Animal類中派生

四、繼承的傳遞性

C類從B類繼承,B類又從A類繼承,那么C類就具有B類和A類的所有屬性和方法

總結: 子類擁有父類以及父類的父類中封裝的所有屬性和方法

代碼體驗:

class Animal():
    def eat(self):
        print("吃")

    def run(self):
        print("跑")

    def drink(self):
        print("喝")

    def sleep(self):
        print("睡")

class Dog(Animal):

    def bark(self):
        print("汪汪叫")

class XiaoTianQuan(Dog):

    def fly(self):
        print("老子會飛,哈哈哈哈")

# 創建一個哮天犬對象
xtq = XiaoTianQuan()

# 調用方法
xtq.eat()
xtq.run()
xtq.drink()
xtq.sleep()
xtq.bark()
xtq.fly()

執行結果:

圖片8.png

五、繼承傳遞性的注意事項

注意:看看有沒繼承關系

提問:哮天犬能夠調用Cat類中定義的catch方法嗎?

答案:不能。雖然哮天犬類和Cat類都繼承了Animal父類,但是因為哮天犬和Cat之間沒有繼承關系所以不能。

圖片9.png

更多關于Python基礎知識和進階知識都可以去Python自學網(http://www.wakey.com.cn/學習,還有Python學習路線講解。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容