Python 簡易手冊

單元 64 - 多型

Python 是物件導向程式語言 (object-oriented programming language) ,物件導向程式設計 (object-oriented programming) 有三大特性,分別是封裝 (encapsulation) 、繼承 (inheritance) 與多型 (polymorphism) 。所謂多型是要讓型態具有通用性,傳統物件導向程式語言夠過繼承關係,讓父類別可以當作子類別的通用型態,但是 Python 的類別是依資料模型來設計的,坦白說這樣讓 Python 的多型無處不在,像是序列有相同的操作方式,這就是 Python 詮釋多型的方式,叫做鴨子型態 (duck-typing) 。

鴨子型態的精髓是只要一隻動物,走路看起來像鴨子,游泳看起來像鴨子,叫聲聽起來像鴨子,那這隻動物就會播認定為鴨子。同樣的,只要多個類別類定義相同的操作方式,那些類別都可以被歸為同一類,就像是序列 (sequence) 有序對 (tuple) 、字串 (string) 、串列 (list) 等多種不同資料型態 (data type) 。

簡單舉自行定義鴨子型態的例子如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 定義第一個鴨子類別
class Demo:
    def do_something(self):
        print("There is no spoon.")

# 定義第二個鴨子類別
class Demo2:
    def do_something(self):
        print("Free your mind.")

# 處理鴨子串列
for i in [Demo(), Demo2()]:
    i.do_something()

# 檔名: class_demo29.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

單元 54 - 類別介紹類別 (class) 的基本概念,單元 61 - 封裝會介紹物件導向程式設計的第一項特性 - 封裝,單元 62 - 繼承會介紹物件導向程式設計的第二項特性 - 繼承,單元 55 - 實體屬性與方法介紹如何定義實體屬性及實體方法,單元 23 - for 陳述介紹如何使用 for 迴圈 (loop) ,單元 39 - 串列介紹如何使用串列資料型態。

在這個例子中, DemoDemo2 都定義了 do_something() 方法 (method) ,這讓這兩個鴨子類別可以進行相同的操作,例如這裡放在 for 迴圈 (loop) 中,然後依次呼叫 do_something() ,執行結果如下

> python class_demo29.py
There is no spoon.
Free your mind.
>

參考資料

上一頁 單元 63 - 多重繼承
回 Python 簡易手冊 首頁
下一頁 單元 65 - 抽象方法
回 Python 教材首頁
回程式語言教材首頁