iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

Python的多態性(Polymorphism)是物件導向程式設計中的關鍵概念,允許不同類型的物件使用相同的介面(方法),從而增強程式碼的靈活性和可擴展性。物件表現出不同的行為,即使它們使用相同的方法名稱。

壹、多態性的基本概念

在Python中,多態性表達在不同類別的物件可以透過相同的方法名稱來實現不同的功能。

  • 基本的多態性
class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"

# 定義一個通用的函數,無論傳入的是哪種動物,都可以調用它的 speak 方法
def make_animal_speak(animal):
    print(animal.speak())

dog = Dog()
cat = Cat()

make_animal_speak(dog)  # 輸出: Woof!
make_animal_speak(cat)  # 輸出: Meow!

在這個例子中,DogCat類別都有一個名為speak的方法,當我們呼叫make_animal_speak()時,Python根據確定的物件類型,自動選擇正確的speak方法。

貳、使用繼承與多態

多態性通常與繼承結合使用。

  • 繼承中的多態性
class Animal:
    def speak(self):
        raise NotImplementedError("Subclasses must implement this method")

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

animals = [Dog(), Cat()]

for animal in animals:
    print(animal.speak())

在這個例子中,類別是一個父類,它Animal定義了一個抽象方法speakDog``Cat``speak``animals``speak

參、函數和方法的多態性

Python的函數和方法本質上是動態類型的,這意味著我們可以將不同類型的物件傳遞給同一個函數或方法,而Python會自動選擇合適的行為。

class Bird:
    def fly(self):
        return "Bird is flying"

class Airplane:
    def fly(self):
        return "Airplane is flying"

class Rocket:
    def fly(self):
        return "Rocket is launching"

# 通過一個通用的函數來調用 fly 方法
def fly_anything(flying_object):
    print(flying_object.fly())

bird = Bird()
airplane = Airplane()
rocket = Rocket()

fly_anything(bird)      # 輸出: Bird is flying
fly_anything(airplane)  # 輸出: Airplane is flying
fly_anything(rocket)    # 輸出: Rocket is launching

在這個例子中,無論是鳥、飛機或火箭,它們都可以透過同一個fly方法來實現不同的行為。

肆、Python 中的內建多態性

Python中的許多內建函數也是多態的,它們可以接受不同類型的物件len()

print(len("Hello"))    # 輸出: 5
print(len([1, 2, 3]))  # 輸出: 3
print(len({"a": 1, "b": 2}))  # 輸出: 2

伍、多態性優勢

  • 程式碼的靈活性:多態性使得函數或方法可以處理不同類型的對象,增強了程式碼的靈活性和可擴展性。
  • 易於擴展:當我們增加新的類型時,只需保證新的類型實現相同的方法名稱即可,修改現有的程式碼。
  • 程式碼簡化:使用多態性可以避免大量的if-elseswitch-case判斷邏輯,簡化程式碼結構。

上一篇
第16天:繼承
下一篇
第18天:隨機數
系列文
python30天入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言