4. 走路像鴨子、叫聲像鴨子,他就是鴨子?
2023年12月27日
💎 加入 E+ 成長計畫 如果你喜歡我們的內容,歡迎加入 E+,獲得更多深入的軟體前後端內容
走路像鴨子、叫聲像鴨子,他就是鴨子? 在程式語言的類型中,有兩種類型可以拉出來討論:
- Nominal Typing (名義化類型) 專注於類型的名稱、而非結構,舉例來說:
class Bird:
def fly(self):
return "I can fly!"
class Sparrow(Bird):
pass
def let_it_fly(bird: Bird):
return bird.fly()
sparrow = Sparrow()
print(let_it_fly(sparrow))
此處的 sparrow 被當作是 Bird,因為他繼承了 Bird
- Structure Typing (結構化類型) 更在乎是否有相同的方法和屬性,舉例來說:
class Bird:
def fly(self):
return "I can fly!"
class Airplane:
def fly(self):
return "Flying high in the sky!"
def let_it_fly(thing):
return thing.fly()
bird = Bird()
print(let_it_fly(bird))
# 輸出 I can fly!
airplane = Airplane()
print(let_it_fly(airplane))
輸出 Flying high in the sky!
結構化型別又稱為鴨子型別 (Duck Typing),因為他只在乎結構是否相同,就如同開頭說的,「只要他叫聲像鴨子、走路像鴨子,那他就是鴨子」,這樣的好處在於:
- 靈活性:不必擔心物件的具體類型,僅依據他的方法和屬性決定,不依靠繼承或類的實現。
- 易於理解:通常你只會關注可以做什麼,而非他是什麼,在大型專案中可以減少維護類型層次的複雜性。
- 提高程式碼的重用性:可以讓有相同方法和屬性的物件共享程式碼。