Lập Trình Hướng Đối Tượng (OOP) Trong Python: Hướng Dẫn Cơ Bản
Lập trình hướng đối tượng (Object-Oriented Programming – OOP) là một phương pháp lập trình mạnh mẽ giúp tổ chức mã nguồn hiệu quả hơn. Python hỗ trợ lập trình hướng đối tượng với các khái niệm chính như lớp (class), đối tượng (object), tính đóng gói (encapsulation), tính kế thừa (inheritance) và tính đa hình (polymorphism).
1. Khái Niệm Cơ Bản Về OOP
1.1. Lớp (Class) Và Đối Tượng (Object)
Lớp (class) là một khuôn mẫu để tạo ra các đối tượng. Đối tượng (object) là thực thể cụ thể của một lớp.
Ví dụ: tạo một lớp Student và tạo đối tượng từ lớp này:
class Student:
def __init__(self, name, age):
self.name = name # Thuộc tính (attribute)
self.age = age
def introduce(self): # Phương thức (method)
return f"Tôi là {self.name}, {self.age} tuổi."
# Tạo đối tượng từ lớp Student
s1 = Student("Thảo", 22)
print(s1.introduce()) # Output: Tôi là Thảo, 22 tuổi.
2. Tính Đóng Gói (Encapsulation)
Tính đóng gói giúp bảo vệ dữ liệu bằng cách giới hạn quyền truy cập vào các thuộc tính của đối tượng. Trong Python, có thể sử dụng dấu gạch dưới _ hoặc __ để chỉ định mức độ truy cập:
_attribute: Thuộc tính dùng trong nội bộ lớp (protected).__attribute: Thuộc tính bị ẩn hoàn toàn (private).
Ví dụ:
class BankAccount:
def __init__(self, account_number, balance):
self.account_number = account_number
self.__balance = balance # Thuộc tính private
def deposit(self, amount):
self.__balance += amount
def get_balance(self):
return self.__balance
# Tạo đối tượng
account = BankAccount("123456", 5000)
account.deposit(2000)
print(account.get_balance()) # Output: 7000
🔹 Lưu ý: Không thể truy cập __balance trực tiếp từ bên ngoài (account.__balance sẽ báo lỗi).
3. Tính Kế Thừa (Inheritance)
Tính kế thừa cho phép một lớp con kế thừa thuộc tính và phương thức của lớp cha, giúp tái sử dụng mã nguồn.
Ví dụ:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"Tôi là {self.name}, {self.age} tuổi."
# Lớp con kế thừa từ lớp Person
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age) # Gọi constructor của lớp cha
self.student_id = student_id
def introduce(self): # Ghi đè phương thức (method overriding)
return f"Tôi là {self.name}, {self.age} tuổi, mã sinh viên {self.student_id}."
# Tạo đối tượng từ lớp con
s2 = Student("Minh", 20, "SV12345")
print(s2.introduce()) # Output: Tôi là Minh, 20 tuổi, mã sinh viên SV12345.
🔹 Lưu ý:
super().__init__()giúp gọi constructor của lớp cha.- Lớp con có thể ghi đè (override) phương thức của lớp cha.
4. Tính Đa Hình (Polymorphism)
Tính đa hình cho phép nhiều lớp có phương thức cùng tên nhưng có cách triển khai khác nhau.
Ví dụ:
class Animal:
def speak(self):
return "Âm thanh không xác định"
class Dog(Animal):
def speak(self):
return "Gâu gâu"
class Cat(Animal):
def speak(self):
return "Meo meo"
# Tạo danh sách các đối tượng
animals = [Dog(), Cat(), Animal()]
for animal in animals:
print(animal.speak())
# Output:
# Gâu gâu
# Meo meo
# Âm thanh không xác định
🔹 Lợi ích của đa hình: Giúp viết mã nguồn linh hoạt hơn khi xử lý nhiều loại đối tượng khác nhau mà không cần biết chính xác lớp nào.
5. Lớp Trừu Tượng (Abstract Class)
Lớp trừu tượng là lớp không thể tạo đối tượng trực tiếp, chỉ dùng làm khuôn mẫu cho các lớp con.
Ví dụ dùng module abc:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
r = Rectangle(5, 10)
print(r.area()) # Output: 50
🔹 Lưu ý:
@abstractmethodyêu cầu các lớp con phải triển khai phương thức đó.- Nếu không triển khai, chương trình sẽ báo lỗi.
6. Tổng Kết
Lập trình hướng đối tượng giúp mã nguồn dễ bảo trì, mở rộng và tái sử dụng hơn. Các khái niệm chính trong OOP Python gồm:
✔️ Lớp (Class) & Đối tượng (Object): Xây dựng khuôn mẫu và tạo thực thể.
✔️ Tính đóng gói (Encapsulation): Bảo vệ dữ liệu, giới hạn quyền truy cập.
✔️ Tính kế thừa (Inheritance): Tái sử dụng mã nguồn bằng cách mở rộng lớp cha.
✔️ Tính đa hình (Polymorphism): Cho phép nhiều lớp có phương thức cùng tên nhưng thực hiện khác nhau.
✔️ Lớp trừu tượng (Abstract Class): Xây dựng khuôn mẫu chung cho các lớp con.
💡 Bạn có câu hỏi gì về OOP trong Python? Hãy để lại bình luận bên dưới!