Học bằng cách đọc theo thứ tự

Bài tập Tổng kết Python OOP — Đưa kiến thức đã học vào code

Bốn bài cuối chương Python OOP: special method của Point, super() trong SavingsAccount, validate @property của Celsius, và đa hình area() cho hình. Bạn tự code để ôn lại.

Bài 1: Thiết kế class Point với special method

Xây một class Point đại diện cho tọa độ 2D. Bạn sẽ khởi tạo thuộc tính trong __init__, định nghĩa + giữa hai điểm hoạt động ra sao bằng __add__, và định hình những gì print() hiện ra với __str__ — ba special method làm việc cùng nhau.

Ba special method được kích hoạt theo thứ tự
Point(1, 2)__init__: self.x=1, self.y=2p1 + p2__add__: trả về Point(4, 6)print(p1 + p2)__str__: "(4, 6)"+print
__init__ đặt thuộc tính → __add__ trả về instance mới → __str__ định dạng chuỗi — mỗi cái được gọi lần lượt.

Viết một class Point giữ tọa độ x và y.

Thiết kế nó sao cho gọi print(Point(1, 2) + Point(3, 4)) in ra (4, 6) lên màn hình.

Python Editor

Chạy code để xem đầu ra

Bài 2: Mở rộng tài khoản ngân hàng bằng kế thừa và super()

Kế thừa từ class cha BankAccount để xây SavingsAccount có thể áp dụng lãi suất. Pattern là kế thừa kinh điển: gọi constructor của lớp cha bằng super().__init__(...), rồi thêm các thuộc tính riêng của lớp con lên trên.

Gọi super() để dùng lại __init__ của cha, rồi thêm phần riêng
BankAccount (cha)name / balanceSavingsAccount (con)name / balance / rate__init__self.name, self.balance__init__super().__init__(...)thêm self.rateapply_interest()balance += balance * ratekế thừagọi supermở rộng
Gọi super().__init__(...) từ __init__ của lớp con giúp bạn dùng lại setup của cha và chỉ thêm cái mới ở lớp con.

Viết một class SavingsAccount kế thừa từ BankAccount. Ngoài namebalance của cha, SavingsAccount mang thêm lãi suất rate.

Thêm method apply_interest() để cộng lãi (balance × rate, cắt thành số nguyên) vào balance hiện tại. Dựng SavingsAccount("Linh", 100000, 0.05), gọi apply_interest(), và thiết kế class sao cho print() hiện Linh: 105000.

Python Editor

Chạy code để xem đầu ra

Bài 3: Kiểm tra nhiệt độ với @property

Viết một class Celsius từ chối các phép gán dưới độ không tuyệt đối (-273.15). Bạn sẽ dùng @property và một @value.setter để chèn việc kiểm tra ngay vào phép gán thuộc tính — đó là pattern đóng gói kinh điển.

Setter kiểm tra mọi phép gán
Celsius(25)self.value = 25 → settert.value = -300gán lại → setter25 >= -273.15kiểm tra đạt-300 < -273.15kiểm tra failself._value = 25lưu lạiraise ValueErrorngoại lệ
t.value = X trông giống phép gán thường, nhưng nó đi qua setter, hàm này kiểm tra giá trị trước. Ngoài khoảng → ValueError, trong khoảng → lưu vào _value.

Viết một class Celsius với thuộc tính valuephát sinh ValueError("Không cho phép nhiệt độ dưới độ không tuyệt đối") khi bạn cố gán bất kỳ giá trị nào nhỏ hơn -273.15.

Dựng Celsius(25) và in nhiệt độ, sau đó bọc một phép gán t.value = -300 trong try / except và in thông báo lỗi theo dạng Lỗi: ....

Python Editor

Chạy code để xem đầu ra

Bài 4: Dùng đa hình để tính diện tích trong một vòng lặp

Cho hai class khác nhau một method cùng tên (area()), đặt instance của chúng vào một list, và xử lý chúng bằng một vòng lặp for. Bên gọi không quan tâm class nào là class nào — đó là đa hình ở dạng đơn giản nhất.

Cùng tên method, hành vi khác theo type
Rectanglewidth × heightlist shapes[Rectangle, Circle]Circleπ × radius²Rectangle.area()= w × hfor shape in shapes:shape.area()Circle.area()= π × r²fornếu Rectanglenếu Circle
Khi bạn gọi shape.area() trên mỗi phần tử trong list, method khớp với type thật của phần tử được tự động chọn.

Viết hai class, Rectangle(width, height)Circle(radius), cả hai đều có method area() trả về diện tích. Rectangle tính width × heightCircle tính π × radius bình phương.

Đặt Rectangle(3, 4)Circle(5) vào một list, lặp qua nó, và in mỗi diện tích như Diện tích: 12.00 — định dạng hai chữ số sau dấu phẩy. Dùng math.pi cho π.

Python Editor

Chạy code để xem đầu ra

Bạn đã hoàn thành tốt phần này

Đó là kết thúc của Python OOP. Bạn đã đi qua thiết kế class và instance, các special method như __init__ / __add__ / __str__, kế thừa với super(), đóng gói với @property, đa hình, câu lệnh with, và type hint — gần như mọi công cụ bạn cần để gói dữ liệu và hành vi vào một type duy nhất. Giờ bạn có thể tự định nghĩa kiểu của mình, gắn method vào chúng, và xử lý nhiều kiểu qua một interface chung.

Chương tiếp theo, Python nâng cao, là về vượt qua một file đơn lẻ: tổ chức module và package, và dùng thư viện chuẩndatetime, os, re, json, collections, dataclasses, asyncio, và nhiều hơn nữa — để xây dựng kiểu xử lý mà bạn sẽ thực sự gặp trong code production.