Inheritance cho phép một class (gọi là subclass hay con) tái sử dụng và mở rộng các field và method của một class khác (gọi là superclass hay cha). Nó mô hình hóa quan hệ is-a (là một): một Dog là một Animal.
Tái sử dụng và mở rộng
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog kế thừa mọi thứ từ Animal
def bark(self): # ...và thêm hành vi mới
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → kế thừa, không viết lại
print(d.bark()) # "Woof!" → riêng của Dog
Dog có được __init__ và eat miễn phí và thêm bark. Một subclass cũng có thể override các method được kế thừa để thay đổi hành vi.
Đánh đổi
| Lợi ích | Rủi ro |
|---|---|
| Tái sử dụng code chung | Coupling chặt với class cha |
| Mô hình hóa các cây phân cấp thực tế | Base class mong manh — cha thay đổi làm hỏng con |
| Polymorphism qua một kiểu chung | Cây sâu trở nên khó theo dõi |
Một nguyên tắc phổ biến: ưu tiên composition hơn inheritance khi quan hệ thực ra là "has-a" chứ không phải "is-a."
Tại sao điều này quan trọng
Inheritance là tính năng OOP bị lạm dụng nhiều nhất: rất dễ dùng nó chỉ để chia sẻ code, điều này lại gắn kết (couple) những class không liên quan với nhau.
Dùng đúng cách — chỉ cho các quan hệ is-a thực sự — nó mang lại sự tái sử dụng cộng với polymorphism, cho phép bạn xử lý nhiều subtype một cách đồng nhất thông qua class cha chung của chúng.
