如何在 Python 子類中重寫父類方法
在 Python 中,繼承是一個非常強大的特性,它允許我們創(chuàng)建一個新類(子類),該類可以繼承另一個類(父類)的屬性和方法。有時候,我們需要在子類中修改或擴展父類的方法,這就是所謂的“方法重寫”。本文將詳細介紹如何在 Python 子類中重寫父類方法,從基礎(chǔ)到進階,一步步帶你掌握這個重要技能。
基礎(chǔ)概念
首先,我們來看一個簡單的例子,了解一下什么是方法重寫。
# 定義一個父類
class Animal:
def speak(self):
return "Some sound"
# 定義一個子類,繼承自 Animal
class Dog(Animal):
def speak(self):
return "Woof woof!"
# 創(chuàng)建一個 Dog 對象
dog = Dog()
# 調(diào)用 speak 方法
print(dog.speak()) # 輸出: Woof woof!
在這個例子中,Dog 類繼承了 Animal 類,并且重寫了 speak 方法。當我們調(diào)用 Dog 對象的 speak 方法時,會執(zhí)行 Dog 類中的 speak 方法,而不是 Animal 類中的 speak 方法。
使用 super() 調(diào)用父類方法
有時候,我們不僅想重寫父類的方法,還想在子類中調(diào)用父類的方法。這時,可以使用 super() 函數(shù)。
# 定義一個父類
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return f"{self.name} makes a sound"
# 定義一個子類,繼承自 Animal
class Dog(Animal):
def __init__(self, name):
super().__init__(name) # 調(diào)用父類的初始化方法
def speak(self):
return super().speak() + " - Woof woof!" # 調(diào)用父類的 speak 方法并添加額外信息
# 創(chuàng)建一個 Dog 對象
dog = Dog("Buddy")
# 調(diào)用 speak 方法
print(dog.speak()) # 輸出: Buddy makes a sound - Woof woof!
在這個例子中,Dog 類的 __init__ 方法和 speak 方法都使用了 super() 來調(diào)用父類的相應(yīng)方法。這樣可以在子類中擴展父類的功能,而不僅僅是完全替換。
重寫特殊方法
Python 中有一些特殊方法(也稱為魔術(shù)方法),如 __str__、__len__ 等。這些方法可以被重寫以改變對象的行為。
# 定義一個父類
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
# 定義一個子類,繼承自 Person
class Student(Person):
def __init__(self, name, grade):
super().__init__(name)
self.grade = grade
def __str__(self):
return super().__str__() + f", Grade: {self.grade}"
# 創(chuàng)建一個 Student 對象
student = Student("Alice", 10)
# 打印 Student 對象
print(student) # 輸出: Person: Alice, Grade: 10
在這個例子中,Student 類重寫了 __str__ 方法,使其返回包含學(xué)生年級的信息。
多重繼承中的方法重寫
Python 支持多重繼承,即一個類可以繼承多個父類。在這種情況下,方法重寫的規(guī)則會稍微復(fù)雜一些。
# 定義兩個父類
class Father:
def speak(self):
return "Father's voice"
class Mother:
def speak(self):
return "Mother's voice"
# 定義一個子類,繼承自 Father 和 Mother
class Child(Father, Mother):
def speak(self):
return super().speak() + " - Child's voice"
# 創(chuàng)建一個 Child 對象
child = Child()
# 調(diào)用 speak 方法
print(child.speak()) # 輸出: Father's voice - Child's voice
在這個例子中,Child 類繼承了 Father 和 Mother 類。由于 Father 類在繼承列表中排在前面,所以 super().speak() 會調(diào)用 Father 類的 speak 方法。
實戰(zhàn)案例:銀行賬戶系統(tǒng)
假設(shè)我們要設(shè)計一個銀行賬戶系統(tǒng),其中有一個基本的 Account 類和一個繼承自 Account 的 SavingsAccount 類。SavingsAccount 類需要重寫 withdraw 方法,以實現(xiàn)不同的取款邏輯。
# 定義一個基本的 Account 類
class Account:
def __init__(self, balance):
self.balance = balance
def deposit(self, amount):
self.balance += amount
return self.balance
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
return self.balance
else:
return "Insufficient funds"
# 定義一個 SavingsAccount 類,繼承自 Account
class SavingsAccount(Account):
def __init__(self, balance, interest_rate):
super().__init__(balance)
self.interest_rate = interest_rate
def withdraw(self, amount):
# 取款前檢查余額是否足夠
if amount <= self.balance:
# 檢查取款金額是否超過余額的 50%
if amount > self.balance * 0.5:
return "Withdrawal amount exceeds 50% of balance"
self.balance -= amount
return self.balance
else:
return "Insufficient funds"
# 創(chuàng)建一個 SavingsAccount 對象
savings_account = SavingsAccount(1000, 0.05)
# 存款
print(savings_account.deposit(500)) # 輸出: 1500
# 取款
print(savings_account.withdraw(700)) # 輸出: Withdrawal amount exceeds 50% of balance
print(savings_account.withdraw(500)) # 輸出: 1000
在這個例子中,SavingsAccount 類重寫了 withdraw 方法,增加了取款金額不能超過余額 50% 的限制。這樣可以更好地控制賬戶的安全性和穩(wěn)定性。
總結(jié)
本文詳細介紹了如何在 Python 子類中重寫父類方法,從基礎(chǔ)的概念到高級的多重繼承和實戰(zhàn)案例。通過這些例子,你應(yīng)該能夠理解方法重寫的基本原理和應(yīng)用場景。