Class và Object: phân biệt bản thiết kế và sản phẩm

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Class và object là hai khái niệm đầu tiên trong lập trình hướng đối tượng, và cũng là hai thứ người mới hay nhầm lẫn nhất. Hãy nghĩ đơn giản: class là bản vẽ, object là ngôi nhà xây theo bản vẽ đó.

Class là bản thiết kế

Class (lớp) mô tả một loại thực thể: nó có những thuộc tính nào và làm được những việc gì. Bản thân class chưa phải là một thứ cụ thể, giống như bản vẽ không phải là căn nhà. Bạn có thể dựng nhiều căn nhà từ một bản vẽ, mỗi căn có màu sơn riêng.

class SinhVien:
    truong = "Đại học ABC"          # thuộc tính chung của lớp

    def __init__(self, ten, diem):  # hàm khởi tạo
        self.ten = ten              # thuộc tính riêng
        self.diem = diem

    def gioi_thieu(self):
        return f"{self.ten} - điểm {self.diem}"

Object là bản thể cụ thể

Object (đối tượng, hay instance) được tạo ra từ class bằng cách gọi tên lớp như một hàm:

sv1 = SinhVien("An", 8.5)
sv2 = SinhVien("Bình", 7.0)
print(sv1.gioi_thieu())   # An - điểm 8.5
print(sv2.gioi_thieu())   # Bình - điểm 7.0
sv2.diem = 9.0            # sửa riêng sv2, sv1 không đổi

Mỗi object có dữ liệu riêng, nhưng dùng chung các phương thức do class định nghĩa. Thay đổi sv2 không ảnh hưởng sv1.

Constructor và từ khóa self

Constructor (hàm khởi tạo) là hàm đặc biệt chạy ngay khi object được tạo, dùng để gán giá trị ban đầu. Trong Python tên là __init__, trong Java và C# trùng tên lớp, trong JavaScript là constructor.

Từ khóa self (Python) hay this (Java, C#, JavaScript) trỏ tới chính object đang được thao tác. Nhờ nó mà phương thức biết đang làm việc với dữ liệu của object nào. Trong Python, bạn phải viết self là tham số đầu tiên của mỗi phương thức.

Thuộc tính và phương thức

  • Thuộc tính (attribute/field): dữ liệu của object, như tên, điểm.
  • Phương thức (method): hàm gắn với object, như gioi_thieu().
  • Thuộc tính lớp (class attribute): dùng chung cho mọi object, như tên trường.

Ví dụ trong game: lớp Quai có thuộc tính mau, vi_tri và phương thức di_chuyen(), tan_cong(). Mỗi con quái trên màn hình là một object riêng.

Ví dụ hoàn chỉnh: giỏ hàng

class GioHang:
    def __init__(self):
        self.mon = []

    def them(self, ten, gia, so_luong=1):
        self.mon.append({"ten": ten, "gia": gia, "sl": so_luong})

    def tong_tien(self):
        return sum(m["gia"] * m["sl"] for m in self.mon)

gio = GioHang()
gio.them("Bút", 5000, 4)
gio.them("Vở", 12000, 2)
print(gio.tong_tien())   # 44000

Dữ liệu (danh sách món) và hành vi (thêm, tính tổng) nằm cùng chỗ, nên dễ hiểu và dễ bảo trì hơn nhiều so với biến rải rác khắp chương trình.

Sai lầm hay gặp

  1. Quên self. khi gán thuộc tính, khiến giá trị chỉ là biến cục bộ và biến mất sau khi hàm kết thúc.
  2. Dùng danh sách làm giá trị mặc định cho tham số, ví dụ def __init__(self, ds=[]); mọi object sẽ chia sẻ cùng một danh sách. Hãy dùng None rồi tạo danh sách mới bên trong.
  3. Nhầm giữa gọi lớp và dùng object: SinhVien.gioi_thieu() thay vì sv1.gioi_thieu().
  4. Nhét quá nhiều trách nhiệm vào một lớp. Một lớp nên có một vai trò rõ ràng.

Thêm phương thức đặc biệt trong Python

Python cho phép lớp của bạn "hòa nhập" vào ngôn ngữ nhờ các phương thức có dạng __tên__. Hai phương thức hữu ích nhất cho người mới:

class Diem:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __str__(self):
        return f"({self.x}, {self.y})"

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __add__(self, other):
        return Diem(self.x + other.x, self.y + other.y)

a, b = Diem(1, 2), Diem(3, 4)
print(a + b)          # (4, 6)
print(a == Diem(1, 2))  # True

__str__ quyết định cách in đối tượng, __eq__ định nghĩa phép so sánh bằng, __add__ cho phép dùng dấu +. Nếu không định nghĩa __str__, in đối tượng sẽ ra một dòng khó đọc kiểu địa chỉ bộ nhớ. Bài tập: tạo lớp PhanSo có cộng, nhân và tự rút gọn.

Gợi ý đặt tên và tổ chức lớp

Tên lớp là danh từ viết hoa chữ cái đầu (GioHang), tên phương thức là động từ (them, tinh_tong). Mỗi lớp nên làm một việc: nếu lớp vừa lo dữ liệu, vừa in ra màn hình, vừa lưu file, hãy tách nó thành nhiều lớp nhỏ.

Kết luận

Class là bản thiết kế, object là thực thể sinh ra từ đó. Khi đã nắm vững sự khác biệt này cùng constructor và self, bạn đã sẵn sàng học kế thừa và đa hình. Hãy thử mô hình hóa những thứ quen thuộc quanh bạn như xe máy, thư viện, tài khoản ngân hàng bằng các lớp riêng.

Bạn có thể tiếp tục hành trình với những khóa học lập trình trên codebem.com, học theo tốc độ của riêng mình.

author_photo
Nguyễn Đình Cường

0 comment