OOP là gì và tại sao cần học?
Sau khi nắm vững biến, vòng lặp và hàm trong Python, bạn đã sẵn sàng bước sang một khái niệm quan trọng hơn: Lập trình hướng đối tượng (OOP — Object-Oriented Programming).
OOP là một cách tổ chức code xung quanh các đối tượng (object) — mỗi đối tượng có dữ liệu riêng (thuộc tính) và hành vi riêng (phương thức). Thay vì viết hàng trăm hàm rời rạc, bạn nhóm chúng lại thành các đơn vị logic có ý nghĩa.
OOP được dùng trong hầu hết mọi dự án Python thực tế: từ web framework (Django, Flask) đến data science (sklearn, PyTorch). Hiểu OOP giúp bạn đọc và viết code chuyên nghiệp hơn rất nhiều.
Trước khi học OOP, hãy đảm bảo bạn đã hiểu hàm trong Python.
Class và Object trong Python
Hai khái niệm cốt lõi của OOP là Class và Object.
- Class = bản thiết kế (blueprint). Ví dụ: bản vẽ thiết kế ngôi nhà.
- Object = thực thể được tạo ra từ class đó. Ví dụ: ngôi nhà thực tế được xây theo bản vẽ.
Bạn có thể tạo nhiều object từ cùng một class, giống như xây nhiều ngôi nhà từ cùng một bản vẽ.
Cú pháp tạo Class
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
return f"{self.name} đang sủa: Gâu gâu!"
# Tạo object từ class Dog
my_dog = Dog("Milu", 3)
print(my_dog.bark()) # Milu đang sủa: Gâu gâu!
print(my_dog.name) # Milu
print(my_dog.age) # 3
Phương thức __init__ và self
__init__ là phương thức khởi tạo (constructor) — được gọi tự động khi bạn tạo object mới. Đây là nơi bạn thiết lập các thuộc tính ban đầu cho object.
self là tham chiếu đến chính object đang được tạo ra. Mỗi phương thức trong class đều phải có self là tham số đầu tiên.
# Tạo nhiều object từ cùng một class
dog1 = Dog("Milu", 3)
dog2 = Dog("Bông", 5)
dog3 = Dog("Đốm", 1)
print(dog1.bark()) # Milu đang sủa: Gâu gâu!
print(dog2.bark()) # Bông đang sủa: Gâu gâu!
print(dog3.name) # Đốm
4 Tính chất của OOP
OOP được xây dựng trên 4 tính chất cơ bản. Hiểu 4 tính chất này là nền tảng để viết code OOP tốt.
Đóng gói (Encapsulation)
Đóng gói là che giấu dữ liệu nội bộ, chỉ cho phép truy cập qua các phương thức được kiểm soát. Trong Python, bạn tạo thuộc tính private bằng dấu gạch dưới kép __.
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # private — không truy cập trực tiếp được
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"Nạp {amount:,} VNĐ thành công!")
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
return True
print("Số dư không đủ!")
return False
def get_balance(self):
return self.__balance
account = BankAccount("Nguyễn Văn A", 1000000)
account.deposit(500000)
print(f"Số dư: {account.get_balance():,} VNĐ") # 1,500,000 VNĐ
# account.__balance # Lỗi! Không truy cập trực tiếp được
Kế thừa (Inheritance)
Kế thừa cho phép class con sử dụng lại code từ class cha, đồng thời có thể mở rộng hoặc ghi đè hành vi.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass # Class con sẽ ghi đè phương thức này
class Dog(Animal):
def speak(self):
return f"{self.name}: Gâu gâu!"
class Cat(Animal):
def speak(self):
return f"{self.name}: Meo meo!"
dog = Dog("Milu")
cat = Cat("Kitty")
print(dog.speak()) # Milu: Gâu gâu!
print(cat.speak()) # Kitty: Meo meo!
Đa hình (Polymorphism)
Đa hình nghĩa là cùng một phương thức (speak()) hoạt động khác nhau tùy vào đối tượng. Đây là sức mạnh thực sự của OOP — code linh hoạt, dễ mở rộng.
animals = [Dog("Milu"), Cat("Kitty"), Dog("Bông")]
for animal in animals:
print(animal.speak())
# Milu: Gâu gâu!
# Kitty: Meo meo!
# Bông: Gâu gâu!
Trừu tượng (Abstraction)
Trừu tượng là che giấu sự phức tạp bên trong, chỉ để lộ những gì người dùng cần biết. Bạn đã thấy điều này với BankAccount — người dùng chỉ cần deposit(), withdraw(), không cần biết cách __balance hoạt động bên trong.
Ví dụ thực tế: Tạo class BankAccount hoàn chỉnh
Hãy xây dựng một class BankAccount đầy đủ để tổng hợp tất cả những gì đã học:
class BankAccount:
# Biến class (chung cho tất cả object)
bank_name = "VietCode Bank"
def __init__(self, owner, account_number, balance=0):
self.owner = owner
self.account_number = account_number
self.__balance = balance
self.__transactions = []
def deposit(self, amount):
if amount <= 0:
print("Số tiền nạp phải lớn hơn 0!")
return
self.__balance += amount
self.__transactions.append(f"Nạp: +{amount:,} VNĐ")
print(f"Nạp {amount:,} VNĐ thành công. Số dư: {self.__balance:,} VNĐ")
def withdraw(self, amount):
if amount <= 0:
print("Số tiền rút phải lớn hơn 0!")
return False
if amount > self.__balance:
print("Số dư không đủ!")
return False
self.__balance -= amount
self.__transactions.append(f"Rút: -{amount:,} VNĐ")
print(f"Rút {amount:,} VNĐ thành công. Số dư: {self.__balance:,} VNĐ")
return True
def get_balance(self):
return self.__balance
def print_statement(self):
print(f"\n=== Sao kê tài khoản {self.account_number} ===")
print(f"Chủ tài khoản: {self.owner}")
for transaction in self.__transactions:
print(f" {transaction}")
print(f"Số dư hiện tại: {self.__balance:,} VNĐ")
def __str__(self):
return f"Tài khoản {self.account_number} - {self.owner} - Số dư: {self.__balance:,} VNĐ"
# Sử dụng
acc = BankAccount("Nguyễn Văn A", "123456789", 5000000)
acc.deposit(2000000)
acc.withdraw(1000000)
acc.deposit(500000)
acc.print_statement()
print(acc)
Khi nào nên dùng OOP trong Python?
Nên dùng OOP khi:
- Dự án có nhiều thực thể liên quan đến nhau (User, Product, Order)
- Bạn cần tạo nhiều object với cùng cấu trúc
- Code cần được tái sử dụng và mở rộng
- Dự án lớn với nhiều developer
Không nhất thiết phải dùng OOP khi:
- Script đơn giản, chạy một lần
- Script tự động hóa nhỏ
- Code chỉ có vài chục dòng
Hầu hết các framework Python phổ biến đều dùng OOP: Django models, Flask views, SQLAlchemy... Vì vậy nắm vững OOP là bước không thể bỏ qua nếu bạn muốn làm việc với Python thực tế.
Tổng kết
OOP trong Python xoay quanh 4 khái niệm cốt lõi:
- Class và Object: bản thiết kế và thực thể
- Đóng gói: che giấu dữ liệu nội bộ
- Kế thừa: class con tái sử dụng code class cha
- Đa hình: cùng phương thức, hành vi khác nhau
Bước tiếp theo: thử tự xây dựng một class cho dự án nhỏ của bạn — một Student, Product, hoặc TodoItem. Học OOP tốt nhất qua thực hành!
Xem thêm các bài viết Python tại: Python là gì? Tại sao nên học Python