Cơ bảnKiến thức cơ bản

OOP trong Python: Lập trình hướng đối tượng cho người mới bắt đầu

8 phút đọc1 lượt xem
#python#oop#lập trình hướng đối tượng

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à ClassObject.

  • 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

Về tác giả

Ảnh đại diện tác giả Kenji — họa tiết hình học

Kenji

Kỹ sư phần mềm full-stack (Web), hơn 5 năm kinh nghiệm thực tế

  • Python
  • DB
  • Hạ tầng
  • Đào tạo & cố vấn
  • AI

Làm việc cùng đồng nghiệp người Việt, tôi thấy thiếu tài liệu kỹ thuật rõ ràng bằng tiếng Việt. codeahoc là nơi tôi chia sẻ theo hướng thực tế, dễ áp dụng.

Nguyên tắc nội dung

  • Ưu tiên nguồn gốc và góc nhìn từ thực tế triển khai.
  • Nếu có sai sót, nội dung sẽ được cập nhật và sửa kịp thời.

Khóa học liên quan

100 Days of Code: The Complete Python Pro Bootcamp

Học Python qua 100 dự án thực tế. Phù hợp cho người mới bắt đầu.

4.7499.000 ₫
Xem khóa học →

Python for Data Science and Machine Learning Bootcamp

Học Data Science với Python: pandas, matplotlib, scikit-learn.

4.6499.000 ₫
Xem khóa học →

Automate the Boring Stuff with Python

Tự động hóa công việc lặp đi lặp lại bằng Python.

4.6399.000 ₫
Xem khóa học →