Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Khi chương trình lớn dần, hàng nghìn hàm và biến rải rác sẽ rối như tơ vò. Lập trình hướng đối tượng (OOP) đưa ra cách tổ chức khác: gom dữ liệu và hành vi liên quan vào cùng một "đối tượng" mô phỏng thế giới thực.
Thay vì nghĩ "có dữ liệu và có hàm xử lý", OOP nghĩ "có những thực thể, mỗi thực thể tự biết nó có gì và làm được gì". Ví dụ trong game có nhân vật, kẻ thù, vật phẩm. Mỗi loại có thuộc tính (máu, vị trí) và hành động (di chuyển, tấn công).
class NhanVat:
def __init__(self, ten, mau):
self.ten = ten
self.mau = mau
def nhan_sat_thuong(self, luong):
self.mau = max(0, self.mau - luong)
a = NhanVat("Hiệp sĩ", 100)
a.nhan_sat_thuong(30)
print(a.ten, a.mau) # Hiệp sĩ 70Đóng gói là giấu chi tiết bên trong, chỉ để lộ những gì cần thiết. Bạn lái xe bằng vô lăng và chân ga mà không cần chạm vào động cơ. Với code, ta bảo vệ dữ liệu khỏi bị sửa tùy tiện:
class TaiKhoan:
def __init__(self, so_du):
self._so_du = so_du # quy ước: không đụng trực tiếp
def rut(self, tien):
if tien <= 0 or tien > self._so_du:
raise ValueError("Số tiền không hợp lệ")
self._so_du -= tien
@property
def so_du(self):
return self._so_duMọi thay đổi số dư đều đi qua rut, nơi có kiểm tra. Nhờ vậy dữ liệu luôn hợp lệ.
Lớp con thừa hưởng thuộc tính và phương thức của lớp cha, đồng thời bổ sung hoặc thay đổi theo ý mình. Kế thừa giúp tái sử dụng code và thể hiện quan hệ "là một": Chó là một Động vật.
class DongVat:
def __init__(self, ten):
self.ten = ten
def keu(self):
return "..."
class Cho(DongVat):
def keu(self):
return "Gâu gâu"Đa hình cho phép cùng một lời gọi nhưng hành vi tùy thuộc loại đối tượng:
class Meo(DongVat):
def keu(self):
return "Meo meo"
for con in [Cho("Vàng"), Meo("Mướp"), DongVat("Lạ")]:
print(con.ten, ":", con.keu())Đoạn code gọi keu() mà không cần biết con vật cụ thể, nên khi thêm loại mới bạn không phải sửa vòng lặp.
Trừu tượng là tập trung vào "làm gì" thay vì "làm thế nào". Người dùng lớp chỉ cần biết các phương thức công khai. Trong thực tế, ta thể hiện bằng lớp trừu tượng hoặc interface, quy định các phương thức mà lớp con bắt buộc cung cấp.
OOP phát huy sức mạnh khi chương trình có nhiều thực thể với trạng thái và hành vi gắn liền: game, hệ thống quản lý, giao diện người dùng. Nó ít cần thiết với script xử lý dữ liệu một lần, nơi vài hàm thuần túy rõ ràng hơn. Ba dấu hiệu cho thấy nên chuyển sang OOP:
Ví dụ nhóm biến đi cùng nhau:
# trước: ba biến rời rạc
ten, mau, vi_tri = "Quái", 50, (3, 4)
# sau: gói thành một đối tượng
class Quai:
def __init__(self, ten, mau, vi_tri):
self.ten, self.mau, self.vi_tri = ten, mau, vi_triHãy bắt đầu nhỏ: chuyển một nhóm biến và các hàm liên quan trong dự án cũ của bạn thành một lớp, sau đó xem code gọi nó có gọn hơn không.
Bốn trụ cột đóng gói, kế thừa, đa hình, trừu tượng là bộ khung để suy nghĩ về thiết kế phần mềm. Hãy bắt đầu bằng một mini dự án như quản lý thư viện sách hoặc game đấu sĩ đơn giản, bạn sẽ hiểu rõ hơn khi tự tay tổ chức các lớp.
Học xong lý thuyết, hãy thực hành thật nhiều; các bài giảng có bài tập trong khóa học codebem.com sẽ giúp bạn việc đó.
Nguyễn Đình Cường
0 comment