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() và 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é! :::