Chuyển tới nội dung chính

Bài tập Lập Trình Hướng Đối Tượng (OOP)

Chủ đề: class, __init__, thuộc tính, phương thức, kế thừa (inheritance), đa hình (polymorphism), super().


Phần 1 – Trắc Nghiệm

Câu 1. Phương thức đặc biệt nào được gọi khi tạo đối tượng mới?

  • A. __new__
  • B. __init__
  • C. __create__
  • D. __start__

Câu 2. Trong Python OOP, self đại diện cho gì?

  • A. Lớp hiện tại
  • B. Đối tượng hiện tại
  • C. Hàm hiện tại
  • D. Module hiện tại

Câu 3. Kế thừa trong Python được viết như thế nào?

  • A. class Con: extends Cha
  • B. class Con implements Cha
  • C. class Con(Cha):
  • D. class Con <- Cha:

Phần 2 – Điền Khuyết

Bài 1. Điền để hoàn thiện class HinhTron:

class HinhTron:
def __init__(self, ___, ban_kinh):
self.ten = ten
self.___ = ban_kinh

def dien_tich(self):
import math
return math.pi * self.ban_kinh ___

h = HinhTron("Hình tròn", 5)
print(h.dien_tich()) # 78.53...
Đáp án
class HinhTron:
def __init__(self, ten, ban_kinh):
self.ten = ten
self.ban_kinh = ban_kinh

def dien_tich(self):
import math
return math.pi * self.ban_kinh ** 2

Phần 3 – Lập Trình Thực Hành

Bài 1 – Class Sinh Viên

Tạo class SinhVien với thuộc tính: ho_ten, ma_sv, diem_list. Thêm phương thức: tính điểm trung bình, xếp loại.

Đáp án mẫu
class SinhVien:
def __init__(self, ho_ten, ma_sv):
self.ho_ten = ho_ten
self.ma_sv = ma_sv
self.diem_list = []

def them_diem(self, mon, diem):
self.diem_list.append({"mon": mon, "diem": diem})

def diem_tb(self):
if not self.diem_list:
return 0
return sum(d["diem"] for d in self.diem_list) / len(self.diem_list)

def xep_loai(self):
dtb = self.diem_tb()
if dtb >= 9.0: return "Xuất sắc"
elif dtb >= 8.0: return "Giỏi"
elif dtb >= 6.5: return "Khá"
elif dtb >= 5.0: return "Trung bình"
return "Yếu"

def __str__(self):
return (f"SV: {self.ho_ten} ({self.ma_sv})\n"
f" ĐTB: {self.diem_tb():.2f}{self.xep_loai()}")

# Thử nghiệm
sv = SinhVien("Nguyễn Thanh Vũ", "SV001")
sv.them_diem("Toán", 8.5)
sv.them_diem("Lý", 7.0)
sv.them_diem("Hóa", 9.0)
print(sv)

Bài 2 – Kế thừa: Hình học

Tạo class HinhHoc làm lớp cha, kế thừa thành HinhTron, HinhChuNhat, HinhTamGiac. Mỗi class ghi đè phương thức dien_tich()chu_vi().

Đáp án mẫu
import math

class HinhHoc:
def __init__(self, ten):
self.ten = ten

def dien_tich(self):
raise NotImplementedError("Phải ghi đè phương thức này")

def chu_vi(self):
raise NotImplementedError("Phải ghi đè phương thức này")

def thong_tin(self):
print(f" {self.ten}")
print(f" Diện tích: {self.dien_tich():.2f}")
print(f" Chu vi : {self.chu_vi():.2f}")


class HinhTron(HinhHoc):
def __init__(self, ban_kinh):
super().__init__("Hình tròn")
self.ban_kinh = ban_kinh

def dien_tich(self):
return math.pi * self.ban_kinh ** 2

def chu_vi(self):
return 2 * math.pi * self.ban_kinh


class HinhChuNhat(HinhHoc):
def __init__(self, dai, rong):
super().__init__("Hình chữ nhật")
self.dai = dai
self.rong = rong

def dien_tich(self):
return self.dai * self.rong

def chu_vi(self):
return 2 * (self.dai + self.rong)


class HinhTamGiac(HinhHoc):
def __init__(self, a, b, c):
super().__init__("Hình tam giác")
self.a, self.b, self.c = a, b, c

def dien_tich(self):
s = self.chu_vi() / 2
return math.sqrt(s * (s-self.a) * (s-self.b) * (s-self.c))

def chu_vi(self):
return self.a + self.b + self.c


# Đa hình
hinh_list = [HinhTron(5), HinhChuNhat(4, 6), HinhTamGiac(3, 4, 5)]
for hinh in hinh_list:
hinh.thong_tin()
print()

Bài 3 – Quản lý ngân hàng

Tạo class TaiKhoan với các tính năng: nạp tiền, rút tiền, xem số dư. Kế thừa thành TaiKhoanTietKiem (có lãi suất) và TaiKhoanThanh_Toan.

Đáp án mẫu
class TaiKhoan:
def __init__(self, so_tai_khoan, chu_so_huu, so_du=0):
self.so_tai_khoan = so_tai_khoan
self.chu_so_huu = chu_so_huu
self._so_du = so_du
self.lich_su = []

def nap_tien(self, so_tien):
if so_tien <= 0:
print(" Số tiền không hợp lệ")
return
self._so_du += so_tien
self.lich_su.append(f"+ {so_tien:,}đ → Dư: {self._so_du:,}đ")
print(f" Nạp {so_tien:,}đ thành công")

def rut_tien(self, so_tien):
if so_tien <= 0:
print(" Số tiền không hợp lệ")
elif so_tien > self._so_du:
print(f" Số dư không đủ (Dư: {self._so_du:,}đ)")
else:
self._so_du -= so_tien
self.lich_su.append(f"- {so_tien:,}đ → Dư: {self._so_du:,}đ")
print(f" Rút {so_tien:,}đ thành công")

@property
def so_du(self):
return self._so_du

def __str__(self):
return (f"TK: {self.so_tai_khoan} | {self.chu_so_huu}\n"
f" Số dư: {self._so_du:,}đ")


class TaiKhoanTietKiem(TaiKhoan):
def __init__(self, so_tai_khoan, chu_so_huu, so_du=0, lai_suat=0.05):
super().__init__(so_tai_khoan, chu_so_huu, so_du)
self.lai_suat = lai_suat

def tinh_lai(self, so_thang):
lai = self._so_du * self.lai_suat * so_thang / 12
print(f" Lãi {so_thang} tháng: {lai:,.0f}đ")
return lai


# Thử nghiệm
tk = TaiKhoanTietKiem("TK001", "Nguyễn Thanh Vũ", 1_000_000, 0.06)
tk.nap_tien(500_000)
tk.rut_tien(200_000)
tk.tinh_lai(6)
print(tk)

:::tip Hoàn thành! Bạn đã hoàn thành bộ bài tập Python! Tiếp tục luyện tập với các dự án thực tế để củng cố kỹ năng nhé! :::