Làm Chủ Kế Thừa & Đa Hình Trong Python: Từ Nền Tảng Đến Best Practices

lúc 13:19 25 tháng 8, 2026
34 views
Làm Chủ Kế Thừa & Đa Hình Trong Python: Từ Nền Tảng Đến Best Practices

Lập trình hướng đối tượng (OOP) là một trong những trụ cột quan trọng giúp mã nguồn của bạn trở nên gọn gàng, dễ bảo trì và dễ mở rộng. Trong đó, Kế thừa (Inheritance)Đa hình (Polymorphism) là hai tính năng cốt lõi mạnh mẽ nhất giúp bạn tối ưu hóa code.

Bài viết này sẽ dẫn dắt bạn đi từ những khái niệm nền tảng cho đến các kỹ thuật nâng cao và Best Practices trong Python.

🧬 PHẦN 1: KẾ THỪA (INHERITANCE)

1. Khái niệm cơ bản: Mối quan hệ "IS-A" (Là một)

Kế thừa cho phép một lớp mới (lớp con) tái sử dụng các thuộc tính và phương thức của một lớp có sẵn (lớp cha) mà không cần viết lại từ đầu.

  • Mối quan hệ "IS-A": Ví dụ, một Dog (Chó) là một Animal (Động vật). Khi đó, Dog sẽ tự động sở hữu các đặc tính chung của Animal.

2. Cú pháp khai báo lớp con

Trong Python, việc thiết lập quan hệ kế thừa cực kỳ đơn giản bằng cách truyền tên lớp cha vào trong ngoặc đơn khi khai báo lớp con:

Code
class Parent:
    pass

class Child(Parent):
    pass

3. Hàm super(): Mở rộng và giữ lại khởi tạo

Khi lớp con muốn bổ sung thêm các thuộc tính riêng nhưng vẫn giữ lại logic khởi tạo từ lớp cha, ta dùng hàm super().__init__():

Code
class Animal:
    def __init__(self, name: str):
        self.name = name

class Dog(Animal):
    def __init__(self, name: str, breed: str):
        super().__init__(name)  # Gọi hàm khởi tạo của lớp cha
        self.breed = breed      # Thuộc tính riêng của lớp con

4. Đa kế thừa (Multiple Inheritance) & Thứ tự MRO

Python cho phép một lớp con kế thừa từ nhiều lớp cha cùng lúc:

Code
class Flyer:
    pass

class Swimmer:
    pass

class Duck(Flyer, Swimmer):
    pass
  • Thứ tự tìm kiếm phương thức (MRO - Method Resolution Order): Khi một phương thức xuất hiện ở nhiều lớp cha, Python sẽ duyệt theo thứ tự ưu tiên trái sang phải. Bạn có thể kiểm tra thứ tự này bằng:
Code
print(Duck.__mro__)
# or
print(Duck.mro())

5. Kiểm tra kiểu dữ liệu an toàn

  • isinstance(object, Class): Kiểm tra xem một đối tượng có thuộc lớp đó (hoặc lớp cha của nó) hay không.
  • issubclass(ClassA, ClassB): Kiểm tra xem ClassA có phải là lớp con của ClassB hay không.
Code
my_dog = Dog("Rex", "Bulldog")
print(isinstance(my_dog, Animal))  # True
print(issubclass(Dog, Animal))     # True

🟨 PHẦN 2: ĐA HÌNH (POLYMORPHISM)

1. Khái niệm cơ bản

Đa hình cho phép các đối tượng thuộc các lớp khác nhau có thể thực thi cùng một tên phương thức nhưng mang lại các hành vi xử lý khác nhau, giúp mã nguồn uyển chuyển và linh hoạt hơn rất nhiều.

2. Ghi đè phương thức (Method Overriding)

Lớp con có thể viết lại một phương thức đã có ở lớp cha để thay đổi hành vi cho phù hợp với thực tế:

Code
class Cat:
    def make_sound(self) -> str:
        return "Meow"

class Duck:
    def make_sound(self) -> str:
        return "Quack"

3. Đa hình qua Hàm/Hành vi (Function Polymorphism)

Bạn có thể thiết kế một hàm nhận đầu vào là các đối tượng khác nhau nhưng gọi chung một phương thức mà không cần quan tâm đến kiểu dữ liệu cụ thể:

Code
def animal_concert(animal_obj):
    # Cùng gọi phương thức make_sound nhưng kết quả khác nhau tùy đối tượng
    print(animal_obj.make_sound())

animal_concert(Cat())   # In ra: Meow
animal_concert(Duck())  # In ra: Quack

4. Triết lý "Duck Typing" trong Python

  • "Nếu nó đi như vịt, quạc quạc như vịt và bơi như vịt, thì đó chính là con vịt."
  • Trong Python, hai lớp hoàn toàn không cần chung một lớp cha vẫn có thể áp dụng tính đa hình. Miễn là chúng có chung tên phương thức, Python sẽ thực thi bình thường mà không cần kiểm tra tường minh quan hệ kế thừa.

5. Đa hình với các hàm có sẵn (Built-in Polymorphism)

Ngay trong Python Core, đa hình đã được ứng dụng rộng rãi. Ví dụ, hàm len() hoạt động mượt mà với cả str, list, hay dict vì tất cả chúng đều triển khai phương thức ẩn __len__:

Code
print(len("Hello"))       # Đếm số ký tự của string -> 5
print(len([1, 2, 3, 4]))  # Đếm số phần tử của list -> 4

📌 Lời Kết

Hiểu vững Kế thừaĐa hình giúp bạn loại bỏ hàng đống code trùng lặp và làm chủ tư duy thiết kế hướng đối tượng. Hãy đón đọc phần tiếp theo về Abstract Class và Interface để nâng cấp kỹ năng lập trình của bạn lên một tầm cao mới!

Từ khóa tìm kiếm: Python OOP, Kế thừa trong Python, Đa hình Python, Duck Typing Python.

Bình luận

Đăng nhập để để lại bình luận.
Chưa có bình luận nào cho bài viết này.

Bài viết liên quan