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.

Python - Inheritance

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 SnakeLizard đề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