在物件導向編程(OOP)中,繼承和多態是強大的概念,它們允許您建立層次結構的類和實現靈活性的代碼。
繼承:
繼承是一個類從另一個類獲取屬性和方法的過程。父類(也稱為基類或超類)中定義的屬性和方法可以被子類(也稱為派生類)繼承和重用。
以下是一個簡單的例子:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"
在這個例子中,我們定義了一個Animal父類,它有一個屬性name和一個未實現的speak方法。然後,我們創建了Dog和Cat子類,並實現了speak方法。
多態:
多態是一個對不同類型的物件使用相同的接口的概念。這意味著不同類型的物件可以對相同的方法做出不同的回應。
讓我們使用上面的Animal、Dog和Cat類示例來演示多態:
def animal_sound(animal):
return animal.speak()
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(animal_sound(dog)) # 輸出:Buddy says Woof!
print(animal_sound(cat)) # 輸出:Whiskers says Meow!
這裡,我們創建了一個名為animal_sound的函數,它接受一個Animal對象作為參數,然後調用animal.speak()方法。無論是Dog還是Cat的實例,都可以作為參數傳遞給animal_sound函數,並且多態性使得它們可以對應不同的Speak行為。
# 定義一個名為Animal的父類
class Animal:
# 父類的構造函數,接受一個name參數,用於設置物件的name屬性
def __init__(self, name):
self.name = name
# 定義一個未實現的speak方法,子類將根據需要實現這個方法
def speak(self):
pass
# 定義一個名為Dog的子類,繼承自Animal
class Dog(Animal):
# 子類的構造函數,接受一個name參數,並調用父類的構造函數設置name屬性
def __init__(self, name):
super().__init__(name)
# 實現speak方法,返回一個描述狗叫聲的字符串
def speak(self):
return f"{self.name} says Woof!"
# 定義一個名為Cat的子類,繼承自Animal
class Cat(Animal):
# 子類的構造函數,接受一個name參數,並調用父類的構造函數設置name屬性
def __init__(self, name):
super().__init__(name)
# 實現speak方法,返回一個描述貓叫聲的字符串
def speak(self):
return f"{self.name} says Meow!"
# 定義一個函數animal_sound,接受一個Animal對象作為參數
def animal_sound(animal):
# 調用animal對象的speak方法,返回該物件的叫聲
return animal.speak()
# 創建一個名為dog的Dog類的實例,name設為"Buddy"
dog = Dog("Buddy")
# 創建一個名為cat的Cat類的實例,name設為"Whiskers"
cat = Cat("Whiskers")
# 調用animal_sound函數,傳遞dog對象作為參數,並輸出結果
print(animal_sound(dog)) # 輸出:Buddy says Woof!
# 調用animal_sound函數,傳遞cat對象作為參數,並輸出結果
print(animal_sound(cat)) # 輸出:Whiskers says Meow!
這種繼承和多態的概念使得代碼更加靈活,允許您輕鬆擴展和維護大型項目,並使代碼更易讀和理解。繼續學習OOP的高級主題,以更好地利用這些概念來解決複雜的問題。