Trong hành trình từ một sinh viên Học viện Kỹ thuật quân sự cho đến khi chiến đấu với các dự án thực tế với Python, dù ngôn ngữ có thay đổi thì tư duy về giải quyết vấn đề cụ thể hơn là tư duy về OOP vẫn là "xương sống" giúp code của chúng ta sạch sẽ, dễ bảo trì và mở rộng.
Hôm nay, hãy cùng mình giải mã 4 tính chất cốt lõi của OOP thông qua các ví dụ đời thường nhất nhé.
1. Tính Đóng gói (Encapsulation)
Khái niệm: Là việc che giấu thông tin và những tính chất xử lý bên trong của đối tượng. Người ngoài chỉ có thể tương tác với đối tượng thông qua các interface công khai.
Ví dụ: Hãy tưởng tượng chiếc Thẻ ngân hàng bạn đang dùng. Bạn biết cách quẹt thẻ, nhập mã PIN để rút tiền (interface), nhưng bạn không hề biết hệ thống bên trong xử lý trừ tiền hay kiểm tra số dư như thế nào (encapsulation).
Lợi ích: Bảo vệ dữ liệu không bị thay đổi tùy tiện từ bên ngoài.
Sử dụng các tiền tố
_hoặc__để bảo vệ thuộc tính khỏi việc truy cập trái phép.Python code:class BankAccount:
def __init__(self, balance):
self.__balance = balance # Thuộc tính ẩn (private)
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"Nạp thành công {amount}")
def get_balance(self):
return f"Số dư hiện tại: {self.__balance}"
# Sử dụng
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance())
# print(account.__balance) # Sẽ báo lỗi vì không thể truy cập trực tiếp
2. Tính Kế thừa (Inheritance)
Khái niệm: Cho phép một đối tượng sở hữu lại các thuộc tính và phương thức từ một đối tượng khác đã tồn tại.
Ví dụ: Trong dự án Football Player Detection mình từng làm, chúng ta có một lớp cha là
Person(có tên, tuổi). LớpPlayersẽ kế thừa từPersonvà có thêm các thuộc tính riêng nhưclub,position.Lợi ích: Tái sử dụng mã nguồn, tránh viết lại những thứ đã có.
Lớp
Playerkế thừa toàn bộ thuộc tính của lớpPerson.Python code:class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Player(Person):
def __init__(self, name, age, club):
super().__init__(name, age) # Gọi hàm khởi tạo của lớp cha
self.club = club
def info(self):
print(f"Cầu thủ: {self.name}, Tuổi: {self.age}, Câu lạc bộ: {self.club}")
# Sử dụng
messi = Player("Lionel Messi", 37, "Inter Miami")
messi.info()
3. Tính Đa hình (Polymorphism)
Khái niệm: Cùng một hành động nhưng các đối tượng khác nhau sẽ thực hiện theo các cách khác nhau.
Ví dụ: Giả sử mình có hàm
make_sound(). Nếu đối tượng làDog, nó sẽ kêu "Gâu gâu", nhưng nếu làCat, nó sẽ kêu "Meo meo". Cùng một tên hàm, nhưng kết quả thực thi lại khác biệt tùy vào đối tượng gọi nó.Lợi ích: Giúp hệ thống linh hoạt, dễ dàng mở rộng thêm các loại đối tượng mới mà không cần sửa code cũ.
Cùng một phương thức
make_sound()nhưng mỗi lớp con lại có cách phản hồi khác nhau.Python code:class Animal:
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Gâu gâu!"
class Cat(Animal):
def make_sound(self):
return "Meo meo!"
# Sử dụng
animals = [Dog(), Cat()]
for animal in animals:
print(animal.make_sound())
4. Tính Trừu tượng (Abstraction)
Khái niệm: Tập trung vào những đặc điểm cốt lõi của đối tượng và loại bỏ những chi tiết rườm rà, không cần thiết.
Ví dụ: Trong hệ thống thanh toán, người dùng chỉ cần gọi pay(). còn việc xử lý qua thẻ, ví điện tử hay PayPal bên trong như thế nào thì không cần biết. Đó chính là sự trừu tượng hóa.
Lợi ích: Giảm sự phức tạp khi thiết kế hệ thống lớn.
Sử dụng thư viện
abcđể tạo lớp cơ sở, bắt buộc các lớp con phải định nghĩa lại các hành động cụ thể.Python code:from abc import ABC, abstractmethod
class PaymentMethod(ABC):
@abstractmethod
def pay(self):
pass
class CreditCardPayment(PaymentMethod):
def pay(self, amount):
print(f"Thanh toán {amount} bằng thẻ tín dụng")
class PaypalPayment(PaymentMethod):
def pay(self, amount):
print(f"Thanh toán {amount} bằng PayPal")
class MomoPayment(PaymentMethod):
def pay(self, amount):
print(f"Thanh toán {amount} bằng ví MoMo")
Lời kết: Nắm vững 4 tính chất này không chỉ giúp bạn qua bài phỏng vấn mà còn là chìa khóa để viết code "sạch" hơn trong các dự án thực tế.
No comments:
Post a Comment