Duck Typing
- Python 的多型做得很寬鬆 → 也就是說可以將「同樣的動作」應用在「不同的物件」上,無論它們的類別是什麼
【範例】
- 在三個 Quote 類別使用相同的 __init__() 初始程式,但加入兩個「新函式」
- who() 只會「回傳」被存起來的「person 字串的值」
- says() 會「回傳」被「儲存的字串」,並使用「特定的標點符號」
以下是它們的動作:
# 接著 Python 會自動呼叫父類別 Quote 的 __init__()方法,來儲存實例變數 person 與 words
# 這就是可以在 QuestionQuote 與 ExclamationQuote 子類別建立的物件中存取 self.words 的原因
>>> class Quote():
def __init__(self, person, words)
self.person = person
self.words = words
def who(self):
return self.person
def says(self):
return self.words + '.'
# 並未修改 QuestionQuote 或 ExclamationQuote 初始化的方式,所以沒有覆寫它們 __init__() 方法
>>> class QuestionQuote(Quote):
def says(self):
return self.words + '?'
>>> class ExclamationQuote(Quote):
def says(self):
return self.words + '!'
接下來,來製作一些物件:
>>> 物件名稱1 = Quote('字串1', '字串2')
>>> print(物件名稱1.who(), '字串3', 物件名稱1.says())
字串1 字串3 字串2.
>>> 物件名稱2 = QuestionQuote('字串4', '字串5')
>>> print(物件名稱2.who(), '字串3', 物件名稱2.says())
字串4 字串3 字串5?
>>> 物件名稱3 = ExclamationQuote('字串6', '字串7')
>>> print(物件名稱3.who(), '字串3', 物件名稱3.says())
字串6 字串3 字串7!
# 三個不同的 says() 版本提供「不同的行為」給「三個類型」 → 這是傳統的「物件導向語言多型」
>>> hunter = Quote('Elmer Fudd', "I'm hunting wabbits")
>>> print(hunter.who(), 'says:', hunter.says())
Elmer Fudd says: I'm hunting wabbits.
>>> hunted1 = QuestionQuote('Bugs Bunny', "What's up, doc")
>>> print(hunted1.who(), 'says:', hunted1.says())
Bugs Bunny says: What's up, doc?
>>> hunted2 = ExclamationQuote('Daffy Duck', "It's rabbit season")
>>> print(hunted2.who(), 'says:', hunted2.says())
Daffy Duck says: It's rabbit season!
【範例】
- Python 更上一層樓,可執行任何擁有 who() 與 says() 方法的物件的兩個方法
- 定義一個名為 BabblingBrook 的類別,它與之前獵人及獵物無關(Quote 類別的後代)
>>> class BabbingBroke():
def who(self):
return 'Brook'
def says(self):
return 'Babble'
>>> brook BabbingBroke()
接著,執行各個物件的 who() 與 says() 方法,有一個(brook)與其他的完全無關
>>> def who_says(obj):
print(obj.who(), 'says', obj.says())
>>> who_says(hunter)
Elmer Fudd says I'm hunting wabbits.
>>> who_says(hunted1)
Bugs Bunny says What's up, doc?
>>> who_says(hunted2)
Daffy Duck says It's rabbit season!
>>> who_says(brook)
Brook says Babble
# 這個行為有時稱為 duck typing,來自這句古語:如果牠走路的樣子像鴨子,且叫聲像鴨子,那牠就是隻鴨子__一位有智慧的人