Lập trình Hướng đối tượng trong Python: Cơ bản và Thực hành

Giới thiệu về Lập trình Hướng đối tượng

Python hỗ trợ đầy đủ mô hình lập trình hướng đối tượng (OOP), cho phép xây dựng hệ thống phần mềm linh hoạt thông qua việc tổ chức code thành các thực thể có trạng thái và hành vi riêng biệt.

Thiết lập Lớp và Đối tượng

Lớp (class) đóng vai trò như khuôn mẫu định nghĩa cấu trúc dữ liệu, trong khi đối tượng (object) là thể hiện cụ thể của lớp đó. Quy ước đặt tên lớp sử dụng PascalCase.

class ThucThe:
    def __init__(self, ten):
        self.ten = ten
    
    def chao_hoi(self):
        print(f"Xin chào, tôi là {self.ten}")

doi_tuong = ThucThe("Việt Nam")
doi_tuong.chao_hoi()  # Kết quả: Xin chào, tôi là Việt Nam

Thuộc tính Thể hiện và Thuộc tính Lớp

Thuộc tính thể hiện (instance attribute) đặc trưng cho từng đối tượng riêng lẻ, trong khi thuộc tính lớp (class attribute) được chia sẻ chung giữa tất cả các đối tượng.

class HinhTron:
    PI = 3.14159
    
    def __init__(self, ban_kinh):
        self.ban_kinh = ban_kinh

    def tinh_dien_tich(self):
        return self.PI * self.ban_kinh ** 2

hinh1 = HinhTron(5)
hinh2 = HinhTron(3)
print(f"Hình 1: {hinh1.tinh_dien_tich():.2f}")  # 78.54
print(f"Hình 2: {hinh2.tinh_dien_tich():.2f}")  # 28.27

Phương thức Đặc biệt

Các phương thức có tiền tố và hậu tố kép gạch dưới (dunder methods) cho phép tùy chỉnh hành vi của đối tượng trong các ngữ cảnh khác nhau:

  • __init__: Khởi tạo đối tượng
  • __str__: Chuỗi mô tả khi in đối tượng
  • __len__: Xác định độ dài bằng hàm len()
  • __eq__: So sánh bằng nhau

Từ khóa self

Từ khóa self tham chiếu đến đối tượng hiện tại trong phương thức, cho phép truy cập thuộc tính và phương thức của chính lớp đó.

class Nguoi:
    def __init__(self, ho_ten):
        self.ho_ten = ho_ten

    def gioi_thieu(self):
        print(f"Xin chào, tôi tên là {self.ho_ten}")

ca_nhan = Nguoi("Nguyễn Văn A")
ca_nhan.gioi_thieu()

Quản lý Bộ nhớ với __slots__

Thuộc tính __slots__ hạn chế các thuộc tính có thể thêm vào đối tượng, giúp tối ưu hiệu năng và tiết kiệm bộ nhớ.

class DoiTuong:
    __slots__ = ('ma_so', 'gia_tri')
    
    def __init__(self, ma_so, gia_tri):
        self.ma_so = ma_so
        self.gia_tri = gia_tri

doi_tuong = DoiTuong(100, "Dữ liệu")
doi_tuong.them_moi = "Thử nghiệm"  # Lỗi: Không thể thêm thuộc tính ngoài slots

Thực hành Xây dựng Lớp

Ví dụ 1: Quản lý tài khoản ngân hàng

class TaiKhoan:
    def __init__(self, so_du=0):
        self.so_du = so_du

    def nap_tien(self, so_tien):
        self.so_du += so_tien

    def rut_tien(self, so_tien):
        if so_tien <= self.so_du:
            self.so_du -= so_tien
        else:
            print("Số dư không đủ")

tai_khoan = TaiKhoan(1000000)
tai_khoan.nap_tien(500000)
tai_khoan.rut_tien(300000)
print(f"Số dư hiện tại: {tai_khoan.so_du} VND")

Ví dụ 2: Tính điểm trung bình học sinh

class HocSinh:
    def __init__(self, ten, tuoi):
        self.ten = ten
        self.tuoi = tuoi
        self.diem = []

    def them_diem(self, diem):
        if 0 <= diem <= 10:
            self.diem.append(diem)

    def tinh_diem_tb(self):
        return round(sum(self.diem)/len(self.diem), 2) if self.diem else 0

hs = HocSinh("Trần Thị B", 17)
hs.them_diem(8.5)
hs.them_diem(9.0)
print(f"Điểm trung bình: {hs.tinh_diem_tb()}")

Ví dụ 3: Mô phỏng hoạt động xe hơi

class XeHoi:
    def __init__(self, hang, mau_sac):
        self.hang = hang
        self.mau_sac = mau_sac
        self.trang_thai = "dừng"

    def khoi_dong(self):
        if self.trang_thai == "dừng":
            self.trang_thai = "chạy"
            print(f"Xe {self.hang} màu {self.mau_sac} đang nổ máy")
        else:
            print("Xe đã đang chạy")

    def dung_xe(self):
        if self.trang_thai == "chạy":
            self.trang_thai = "dừng"
            print(f"Xe {self.hang} màu {self.mau_sac} đã dừng")
        else:
            print("Xe chưa khởi động")

xe = XeHoi("Toyota", "đỏ")
xe.khoi_dong()
xe.dung_xe()

Thẻ: python-oop magic-methods __slots__ class-attributes self-keyword

Đăng vào ngày 17 tháng 6 lúc 03:35