Python - Thừa Kế
Thừa Kế là gì trong Python?
Thừa kế là một khái niệm cơ bản trong lập trình hướng đối tượng (OOP) cho phép một lớp kế thừa các thuộc tính và phương thức của một lớp khác. Điều này cho phép tái sử dụng mã và tính chất đa phần, vì bạn có thể tạo ra các lớp mới dựa trên các lớp hiện có mà không cần phải viết lại mã tương tự. Trong Python, thừa kế được thực hiện bằng cách sử dụng từ khóa class
后面跟着 một lớp cha trong dấu ngoặc đơn.
Tạo một Lớp Cha
Hãy bắt đầu bằng cách tạo một lớp cha đơn giản có tên là Animal
:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement this method")
Trong ví dụ này, chúng ta định nghĩa một lớp Animal
với một phương thức __init__
khởi tạo thuộc tính name
và một phương thức speak
ném ra một lỗi NotImplementedError
. Lỗi này sẽ được ném ra nếu lớp con không cung cấp triển khai riêng của phương thức speak
.
Tạo một Lớp Con
Bây giờ, hãy tạo một lớp con có tên là Dog
kế thừa từ lớp Animal
:
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
Lớp Dog
kế thừa tất cả các thuộc tính và phương thức của lớp Animal
, nhưng nó cung cấp triển khai riêng của phương thức speak
. Khi chúng ta tạo một thể hiện của lớp Dog
và gọi phương thức speak
của nó, nó sẽ trả về "[tên của chú] says Woof!" thay vì ném ra lỗi.
my_dog = Dog("Buddy")
print(my_dog.speak()) # Output: Buddy says Woof!
Các Loại Thừa Kế
Có ba loại thừa kế trong Python: thừa kế đơn, thừa kế đa, thừa kế đa cấp và thừa kế tháp. Chúng ta sẽ khám phá từng loại chi tiết.
Python - Thừa Kế Đơn
Thừa kế đơn là dạng thừa kế phổ biến nhất, nơi một lớp kế thừa từ chỉ một lớp cha. Như chúng ta đã thấy ở trên, lớp Dog
kế thừa từ lớp Animal
, đó là một ví dụ về thừa kế đơn.
Python - Thừa Kế Đa
Thừa kế đa xảy ra khi một lớp kế thừa từ nhiều lớp cha hơn. Tuy nhiên, Python không hỗ trợ thừa kế đa trực tiếp qua cú pháp định nghĩa lớp. Thay vào đó, nó sử dụng kỹ thuật gọi là "mixins" hoặc "interfaces" để đạt được thừa kế đa.
Thứ Tự Giải Quyết Phương Thức (MRO)
Python sử dụng thuật toán đường thẳng C3 để xác định thứ tự mà các lớp cơ bản được tìm kiếm khi tìm kiếm một phương thức. MRO đảm bảo rằng mỗi lớp xuất hiện tối đa một lần trong thứ tự giải quyết phương thức và nó duy trì thứ tự của các lớp cơ bản như chúng được xác định trong cú pháp định nghĩa lớp.
Python - Thừa Kế Đa Cấp
Thừa kế đa cấp xảy ra khi một lớp kế thừa từ một lớp con, tạo ra một hệ thống lớp. Dưới đây là một ví dụ:
class Mammal(Animal):
pass
class Cat(Mammal):
def speak(self):
return f"{self.name} says Meow!"
Trong trường hợp này, lớp Cat
kế thừa từ lớp Mammal
, ngay cả lớp Mammal
cũng kế thừa từ lớp Animal
. Điều này tạo ra một hệ thống thừa kế đa cấp.
Python - Thừa Kế Tháp
Thừa kế tháp liên quan đến nhiều lớp con kế thừa từ một lớp cha duy nhất. Ví dụ:
class Reptile(Animal):
pass
class Snake(Reptile):
def speak(self):
return f"{self.name} says Hiss!"
class Lizard(Reptile):
def speak(self):
return f"{self.name} says Crawl!"
Trong trường hợp này, cả lớp Snake
và Lizard
đều kế thừa từ lớp Reptile
, ngay cả lớp Reptile
cũng kế thừa từ lớp Animal
. Điều này tạo ra một cấu trúc thừa kế tháp.
Python - Thừa Kế Kết Hợp
Thừa kế kết hợp kết hợp các tính năng của thừa kế đa và các loại thừa kế khác. Nó không được hỗ trợ trực tiếp trong Python, nhưng có thể đạt được bằng cách sử dụng mixins hoặc kết hợp các loại thừa kế khác nhau.
Hàm super()
Hàm super()
được sử dụng để gọi các phương thức từ lớp cha trong lớp con. Nó rất hữu ích khi bạn muốn mở rộng hoặc ghi đè một phương thức từ lớp cha mà vẫn giữ lại một phần chức năng của nó. Dưới đây là một ví dụ:
class Bird(Animal):
def __init__(self, name, wingspan):
super().__init__(name)
self.wingspan = wingspan
def speak(self):
return f"{self.name} says Chirp!"
Trong trường hợp này, lớp Bird
kế thừa từ lớp Animal
và sử dụng hàm super()
để gọi phương thức __init__
của lớp cha. Điều này đảm bảo rằng thuộc tính name
được khởi tạo đúng cách. Ngoài ra, lớp Bird
cung cấp triển khai riêng của phương thức speak
.
my_bird = Bird("Tweety", 10)
print(my_bird.speak()) # Output: Tweety says Chirp!
Bằng cách sử dụng thừa kế, bạn có thể tạo ra các lớp được đặc biệt hơn kế thừa và mở rộng chức năng của lớp cha, thúc đẩy việc tái sử dụng mã và tổ chức mã. Hãy nhớ rằng thừa kế chỉ là một khía cạnh của OOP, và có các khái niệm khác như đa hình, đóng gói và trừu tượng cũng đóng vai trò quan trọng trong thiết kế các hệ thống phần mềm độc lập và dễ bảo trì.
Credits: Image by storyset