據廖雪峰python3教程----python學習第十三天

在OOP程序設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。


編寫一個名為 Animal 的class,有一個 run() 方法可以直接打印:

1
2
3
>>>?class?Animal(object):
?????def?run(self):
??????????print('Animal?is?running...')

當我們需要編寫Dog和Cat類時,就可以直接從Animal類繼承:

1
2
3
4
5
>>>?class?Dog(Animal):
?????pass
>>>?class?Cat(Animal):
?????pass

對于Dog來說,Animal就是它的父類,對于Animal來說,Dog就是它的子類。cat和Dog類似。

集成有什么好處?最大的好處是子類獲得了父類的全部功能。由于Animal實現了run()方法,因此,Dog和Cat作為它的子類,什么事也沒干,就自動擁有了run()方法:

1
2
3
4
5
6
7
>>>?dog?=?Dog()
>>>?dog.run()
Animal?is?running...
>>>?cat?=?Cat()
>>>?cat.run()
Animal?is?running...

也可以對子類增加一些方法,比如Dog類:

1
2
3
4
5
>>>?class?Dog(Animal):
?????def?run(self):
??????????print('Dog?is?running...')
?????def?eat(self):
??????????print('Eating?meat...')

繼承的第二個好處需要我們對代碼做一點改進,對于Dog和Cat,調用run() 的時候,顯示的都是?Animal is running... ?,符合邏輯的做法分別顯示??Dog is running...Cat is running...,因此,對DogCat類改進如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>>?class?Dog(Animal):
?????def?run(self):
??????????print('Dog?is?running...')
>>>?class?Cat(Animal):
?????def?run(self):
??????????print('Cat?is?running...')
>>>?dog=Dog()
>>>?dog.run()
Dog?is?running...
>>>?cat=Cat()
>>>?cat.run()
Cat?is?running...

當子類和父類都存在相同的run()方法時,我們說。子類的run()覆蓋了父類的run(),再代碼運行的時候,總是會調用子類的run()。這樣,我們就獲得了繼承的另一個好處:多態


要理解什么是多態,我們首先要對數據類型再作一點說明。當我們定義一個class的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什么兩樣:

1
2
3
4
5
6
7
8
9
10
11
12
>>>?isinstance(a,list)
True
>>>?isinstance(b,Animal)
True
>>>?isinstance(c,Dog)
True
#再看一個:
>>>?isinstance(c,Animal)
True
#看來c不僅僅是Dog,c還是Animal!

因為Dog是從Animal繼承下來的,當我們創建了一個Dog的實例c時,我們認為c的數據類型是Dog沒錯,但c同時也是Animal也沒錯,Dog本來就是Animal的一種!


所以,在繼承關系中,如果一個實例的數據類型是某個子類,那它的數據類型也可以被看做是父類。但是,反過來就不行:

1
2
3
>>>?b?=?Animal()
>>>?isinstance(b,Dog)
False

Dog可以看成Animal,但Animal不可以看成Dog

要理解多態的好處,我們還需要再編寫一個函數,這個函數接受一個Animal類型的變量:

1
2
3
4
5
6
7
8
9
10
11
12
13
def?run_twice(animal):
????animal.run()
????animal.run()
>>>?run_twice(Animal())
Animal?is?running...
Animal?is?running...
>>>?run_twice(Dog())
Dog?is?running...
Dog?is?running...
>>>?run_twice(Cat())
Cat?is?running...
Cat?is?running...

看上去沒啥意思,但是仔細想想,現在,如果我們再定義一個Tortoise類型,也從Animal派生:

1
2
3
4
5
6
7
8
class?Tortoise(Animal):
????def?run(self):
????????print('Tortoise?is?running?slowly...')
#當我們調用run_twice()時,傳入Tortoise的實例:
>>>?run_twice(Tortoise())
Tortoise?is?running?slowly...
Tortoise?is?running?slowly...

你會發現,新增一個Animal的子類,不必對run_twice()做任何修改,實際上,任何依賴Animal作為參數的函數或者方法都可以不加修改地正常運行,原因就在于多態。

多態的好處就是,當我們需要傳入DogCatTortoise……時,我們只需要接收Animal類型就可以了,因為DogCatTortoise……都是Animal類型,然后,按照Animal類型進行操作即可。由于Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類或者子類,就會自動調用實際類型的run()方法,這就是多態的意思:

對于一個變量,我們只需要知道它是Animal類型,無需確切地知道它的子類型,就可以放心地調用run()方法,而具體調用的run()方法是作用在AnimalDogCat還是Tortoise對象上,由運行時該對象的確切類型決定,這就是多態真正的威力:調用方只管調用,不管細節,而當我們新增一種Animal的子類時,只要確保run()方法編寫正確,不用管原來的代碼是如何調用的。這就是著名的“開閉”原則:

對擴展開放:允許新增Animal子類;


對修改封閉:不需要修改依賴Animal類型的run_twice()等函數。




本文轉自 nw01f 51CTO博客,原文鏈接:http://blog.51cto.com/dearch/1764522,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《增廣賢文》

(《增廣賢文》),并非吾原創。其中人生之道理,今之看來,雖有偏激之處,未嘗不有警醒之用。吾輩取精去糟,察納雅言即可。———————————————————————————————————…

禁錮自己的因素,原來有這么多

2022年的7月,朋友圈都能看到喜慶的時刻,慶祝香港回歸25周年,這確實是一個具有偉大里程碑的意義。同時也是建黨101周年,滿滿的榮譽感,隔著朋友圈都能感受到喜慶。家事國事天下事,事事關心,關心但…

C語言試題152之一個偶數總能表示為兩個素數之和

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:一個偶數總能表示為兩個素數…

[轉]Xshell連接win10 Linux子系統

配置SSH服務: sudo apt-get remove --purge openssh-server ## 先刪ssh sudo apt-get install openssh-server ## 在安裝ssh sudo rm /etc/ssh/ssh_config ## 刪配置文件,讓ssh服務自己想辦法鏈接 sudo service ssh --full…

有兩個地方,用到了javabean對象和屬性字符串值之間的轉換

1.有兩個地方,用到了javabean對象和屬性字符串值之間的轉換 2.一個是接入層spring mvc,將json字符串參數轉換為javaBean。通過RequestBody javaBean方式 3.另一個是,mybatis中javeBean對象與數據庫字段值之間的轉換。 在sql語句的insert/upda…

【EPS精品教程】EPS2016三維測圖軟件常用快捷鍵(建議收藏)

EPS2016三維測圖軟件常用快捷鍵(建議收藏) 狀 態鍵盤位置功能名稱功能描述選擇Shift拖點按下鼠標左鍵移動光標,將目標點拖到其他位置C閉合使打開的當前線閉合,閉合的當前線打開X回退一點從當前點回退一點Shift+X回退多點從當前點開始刪除多點(到光標指向點)Ctrl+T刪除刪除當…

記一個并發規則驗證實現

最近在做一個簡單的風控,其中有一塊需求是這樣的,當主請求參數到達后,會根據這些參數,看調起幾個并發規則,這些規則各自有自己的驗證邏輯,每個規則執行時間長短都不確定,當規則 執行完后&#x…

EIGRP個人學習筆記

【理論部分】1、EIGRP的主要特征:①Cisco專有協議(高級dv路由);②支持VLSM; ③觸發、增量更新;---------減少帶寬的占用④支持多層網絡協議ApplleTalk,IP 和 Novell Netware等協議;⑤收斂速度快;----------采用dual算法…

C語言試題153之判斷一個素數能被幾個 9 整除

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:判斷一個素數能被幾個 9 整除…

[轉]Zookeeper入門看這篇就夠了

Zookeeper是什么 官方文檔上這么解釋zookeeper,它是一個分布式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用…

微服務-springcloud(eureka實踐, nacos實踐)

Spring 體系圖 版本關系 eureka 實踐 1 父工程依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.14</version> </parent> <dependencyManage…

Windows服務二:測試新建的服務、調試Windows服務

一、測試Windows服務 為了使Windows服務程序能夠正常運行&#xff0c;我們需要像創建一般應用程序那樣為它創建一個程序的入口點。像其他應用程序一樣&#xff0c;Windows服務也是在Program.cs的Main()函數中完成這個操作。首先我們在Main&#xff08;&#xff09;函數中創建一…

角度前方交會點坐標計算完整步驟

測量工作中&#xff0c;我們常常會遇到待測點被障礙物遮擋住觀測視線而無法進行觀測的情況。這時候我們就需要特殊的交會計算方法對待定點進行特別的觀測。 前方交會又稱為測角交會&#xff0c;是指從相鄰兩個已知點向待定點觀測兩個水平角&#xff0c;用以計算待定點的坐標。 …

Mysql 的子查詢

子查詢&#xff1a; 子查詢&#xff1a;嵌套在其它查詢中的查詢語句。&#xff08;又稱為內部查詢&#xff09; 主查詢&#xff1a;包含其它子查詢的查詢稱為主查詢。&#xff08;又稱外部查詢&#xff09; 非相關子查詢&#xff1a; 在主查詢中&#xff0c;子查詢只需要執行一…

【系統設計】指標監控和告警系統

在本文中&#xff0c;我們將探討如何設計一個可擴展的指標監控和告警系統。一個好的監控和告警系統&#xff0c;對基礎設施的可觀察性&#xff0c;高可用性&#xff0c;可靠性方面發揮著關鍵作用。下圖顯示了市面上一些流行的指標監控和告警服務。接下來&#xff0c;我們會設計…

C語言試題154之兩個字符串連接程序

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

[轉]Android studio 快速解決Gradle's dependency cache may be corrupt 和 Gradle配置 gradle

用了好久的AS了&#xff0c;官方版本更新&#xff0c;各種配置工具 也跟著更新。更新后導入工程時&#xff08;使用Android工程編譯或者導入新的工程沒有對應的gradle版本&#xff09;一些電腦出現一下問題。 Error:Failed to open zip file. Gradles dependency cache may …

mybatis源碼學習

2019獨角獸企業重金招聘Python工程師標準>>> 學習主線&#xff1a; 目的&#xff1a;mybatis的作用orm框架&#xff0c;用了該框架就不用自己調用jdbc了。 用法&#xff1a;。。。。。 邏輯&#xff1a;。。。。。 源代碼&#xff1a;。。。。。 1、猜想mybatis對數…

自己封裝一個彈框插件

彈出層提示信息&#xff0c;這是移動前端開發中最常見的需求&#xff0c;你可能會想到一些流行的彈框插件&#xff0c;比如 經典的artDialog 炫酷的Sweetalert等等.. 但是慢慢地你其實會發現通常情況下需求定制化要求較高&#xff0c;一般的彈框插件可能只滿足大部分要求&#…