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()