Python 速查手冊- 6.10 多型 - 程式語言教學誌

文章推薦指數: 80 %
投票人數:10人

Python 是用鴨子型態(duck type) 的觀念來詮釋多型的,所謂鴨子型態來自美國作家的一句話,中文簡單講就是某個人看見一隻鳥,只要這隻鳥走起路來像鴨子,游泳像鴨子,叫聲 ... Python速查手冊 6.10多型 多型(polymorphism)是物件導向程式設計(object-orientedprogramming)中第三個重要概念,所謂多型是要讓型態有更好的適用性,像是不同型態的物件都能接收到同樣的訊息,各種型態的物件(object)也都能做出各自的反應,其他程式語言可能會透過繼承(inheritance)關係或實作介面來定義多型,導致有些人誤以為Python沒有多型,事實上,多型在Python裡頭無處不在。

Python是用鴨子型態(ducktype)的觀念來詮釋多型的,所謂鴨子型態來自美國作家的一句話,中文簡單講就是某個人看見一隻鳥,只要這隻鳥走起路來像鴨子,游泳像鴨子,叫聲也像鴨子,那這個人就會叫那隻鳥為鴨子,換句話說,Python中只要有一樣的定義都可視作多型。

說這句話的美國作者是JamesWhitcombRiley,詳見維基百科Ducktest的介紹。

先來看到多型簡單的範例,Duck跟Unknown為兩個不同的類別(class),兩者定義三個相同的方法(method),分別是走路walk()、游泳swim()及發出聲音sound() classDuck: defwalk(self): print("....") defswim(self): print("))((") defsound(self): print("呱呱") classUnknown: defwalk(self): print(".*..") defswim(self): print("(())") defsound(self): print("哇哇") #《程式語言教學誌》的範例程式 #http://kaiching.org/ #檔名:poly01.py #功能:示範定義類別 #作者:張凱慶 把兩個類別的實體(instance)物件放到串列(list)d中,利用for迴圈(loop)可作相同的處理,Duck跟Unknown就是鴨子型態的呈現,Python用這種方式來詮釋多型的 frompoly01importDuck frompoly01importUnknown d=[Duck(),Unknown()] foriind: i.walk() i.swim() i.sound() #《程式語言教學誌》的範例程式 #http://kaiching.org/ #檔名:poly02.py #功能:示範定義類別 #作者:張凱慶 於命令列執行以上程式,結果如下 $python3poly02.py .... ))(( 呱呱 .*.. (()) 哇哇 $ 再來看到像是序列(sequence)型態都有count()方法,count()回傳參數(parameter)在該序列裡的總數,例如變數(variable)a為字串(string)"12345",裡頭有一個字串"4",同樣的道理,變數b為有五個元素的串列,由於裡頭沒有字串"4",因此回傳整數0 a="12345" b=[1,2,3,4,"5"] print(a.count("4")) print(b.count("4")) #《程式語言教學誌》的範例程式 #http://kaiching.org/ #檔名:poly03.py #功能:示範定義類別 #作者:張凱慶 於命令列執行以上程式,結果如下 $python3poly03.py 1 0 $ 此外像是類別都有預設的方法,例如前後被兩條底線包圍的__str__()方法,整數11回傳11的字串形式,自行定義的類別也可自訂回傳的字串型態,例如這裡Demo()類別的__str__()方法回傳字串"Demo" classDemo: def__str__(self): return"Demo" print(Demo()) #《程式語言教學誌》的範例程式 #http://kaiching.org/ #檔名:poly04.py #功能:示範定義類別 #作者:張凱慶 於命令列執行以上程式,結果如下 $python3poly4.py Demo $ 相關教學影片 Python物件導向中的多型⇨YouTube頁面連結 上一頁:6.9多重繼承 Python速查手冊-目錄 下一頁:6.11__del__() 回Python教材首頁 回程式語言教材首頁



請為這篇文章評分?