Python - 多型性:初學者指南

你好啊,未來的 Python 大師!今天,我們將進入 Python 中多型性的精彩世界。如果這個詞對你來說像是《哈利波特》中的一個咒語,那也別擔心 - 當您完成這個教程時,您將能夠像專家一樣操控多型性!

Python - Polymorphism

Python 中的多型性是什麼?

想象一下你有一根魔杖(請耐心點,我們這裡要全速前往霍格沃茨)。這根魔杖可以變換成不同的物體 - 有時它是支筆,有時它是把劍,有時它是個手電筒。在編程中,這基本上就是多型性的含義!

在 Python 中,多型性允許不同類的對象被當作公共基礎類的對象來對待。這就像有一把瑞士軍刀代碼 - 一個接口,多種實現。

讓我們看一個簡單的例子:

class Animal:
def speak(self):
pass

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

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

def animal_sound(animal):
print(animal.speak())

# 創建對象
dog = Dog()
cat = Cat()

# 使用多型性
animal_sound(dog)  # 輸出:Woof!
animal_sound(cat)  # 輸出:Meow!

在這個例子中,DogCat 都從 Animal 類派生。animal_sound 函數不關心它接收的是什麼類型的動物 - 它只是調用 speak 方法。這就是多型性的實現!

在 Python 中實現多型性的方法

Python 提供了多種實現多型性的方法。讓我們一一來探討:

Python 中的鴨子類型

鴨子類型是 Python 中的一個概念,它關注對象的行為而不是其類型。正如俗話所說:"如果它看起來像鴨子,游起來像鴨子,叫起來像鴨子,那麼它很可能就是鴨子。"

以下是一個例子:

class Duck:
def quack(self):
print("Quack, quack!")

class Person:
def quack(self):
print("我正在裝作是隻鴨子!")

def make_it_quack(thing):
thing.quack()

# 創建對象
duck = Duck()
person = Person()

# 使用鴨子類型
make_it_quack(duck)    # 輸出:Quack, quack!
make_it_quack(person)  # 輸出:我正在裝作是隻鴨子!

在這個例子中,make_it_quack 不關心它接收的對象的類型。只要對象有 quack 方法,它就會工作。

Python 中的方法覆寫

當派生類為已在其基礎類中定義的方法提供特定實現時,稱之為方法覆寫。這就像告訴你的父母:"我知道你這麼做,但我要用自己的方式來做!"

以下是一個例子:

class Vehicle:
def move(self):
print("我正在移動!")

class Car(Vehicle):
def move(self):
print("我正在路上開車!")

class Boat(Vehicle):
def move(self):
print("我正在水面上航行!")

# 創建對象
vehicle = Vehicle()
car = Car()
boat = Boat()

# 使用方法覆寫
vehicle.move()  # 輸出:我正在移動!
car.move()      # 輸出:我正在路上開車!
boat.move()     # 輸出:我正在水面上航行!

在這個例子中,CarBoat 覆寫了 Vehicle 類的 move 方法,並提供了它們自己的特定實現。

Python 中運算符重載

Python 允許您定義運算符對您的自定義類的對象應用時的行為。這稱為運算符重載。

以下是一個例子:

class Point:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)

def __str__(self):
return f"({self.x}, {self.y})"

# 創建對象
p1 = Point(1, 2)
p2 = Point(3, 4)

# 使用運算符重載
p3 = p1 + p2
print(p3)  # 輸出: (4, 6)

在這個例子中,我們為我們的 Point 類重載了 + 運算符,通過定義 __add__ 方法。

Python 中方法重載

與其他一些語言不同,Python 不支持傳統意義上的方法重載。但是,我們可以使用默認參數或變長參數來實現類似的功能。

以下是一個例子:

class Calculator:
def add(self, *args):
return sum(args)

# 創建對象
calc = Calculator()

# 使用類似方法重載的功能
print(calc.add(1, 2))        # 輸出:3
print(calc.add(1, 2, 3))     # 輸出:6
print(calc.add(1, 2, 3, 4))  # 輸出:10

在這個例子中,我們的 add 方法可以接受任意數量的參數,模擬方法重載。

多型性方法表格

以下是總結我們討論過的多型性方法的表格:

方法 描述 示例
鴨子類型 專注於對象的行為而不是其類型 make_it_quack(thing)
方法覆寫 派生類為在基礎類中定義的方法提供特定實現 Car.move() 覆寫 Vehicle.move()
運算符重載 定義運算符對自定義類的對象應用時的行為 重載 Point 類的 +
類似方法重載 使用默認或變長參數模擬方法重載 Calculator.add(*args)

就是這樣,各位!您剛剛走出了 Python 精彩的多型性世界的第一步。請記住,熟練才能生巧,所以不要害怕在您自己的代碼中嘗試這些概念。您會發現,在您不知不覺之間,您將能夠像大師一樣塑造您的代碼,創造出優雅且靈活的程序,甚至會讓米開朗基羅都感到嫉妒!

編程愉快,願多型性與您同在!

Credits: Image by storyset