Skip to main content

Bài 3 - Lớp (Class) và Đối Tượng (Object) trong Python

I. Giới thiệu

Trong lập trình hướng đối tượng (OOP - Object-Oriented Programming), Class (Lớp)Object (Đối tượng) là hai khái niệm cơ bản nhất. Python là một ngôn ngữ hỗ trợ mạnh mẽ OOP, giúp tổ chức mã nguồn một cách rõ ràng, dễ bảo trì và tái sử dụng.

1. Class là gì?

  • Class là một bản thiết kế (blueprint) để tạo ra các đối tượng.
  • Nó định nghĩa các thuộc tính (attributes)phương thức (methods) mà đối tượng sẽ có.

2. Object là gì?

  • Object là một thể hiện (instance) cụ thể của một lớp.
  • Một lớp có thể tạo ra nhiều đối tượng khác nhau.

II. Cú pháp cơ bản của Class và Object

1. Định nghĩa một Class

Cách đặt tên một Class - Đặt tên theo phong cách CapWords (hay CamelCase), nghĩa là chữ cái đầu tiên của từ trong tên của Class được viết hoa và không có dấu gạch dưới giữa các từ, điều này giúp code dễ đọc, và bảo đảm tính nhất quán trong các dự án. 

class TenClass:
   # Thuộc tính lớp (class attribute)
   class_attribute = "Giá trị chung cho mọi đối tượng"
   # Hàm khởi tạo (constructor)
   def __init__(self, param1, param2):
       self.param1 = param1  # Thuộc tính đối tượng (instance attribute)
       self.param2 = param2
   # Phương thức (method)
   def method_name(self):
       return f"Xử lý {self.param1} và {self.param2}"

2. Tạo một Object

# Tạo đối tượng từ lớp
object1 = TenClass("Giá trị 1", "Giá trị 2")
# Truy cập thuộc tính
print(object1.param1)  # Output: Giá trị 1
# Gọi phương thức
print(object1.method_name())  # Output: Xử lý Giá trị 1 và Giá trị 2

III. Các thành phần quan trọng trong Class

1. __init__ (Constructor)

  • Được gọi tự động khi tạo đối tượng.
  • Dùng để khởi tạo các thuộc tính.
class Person:
   def __init__(self, name, age):
       self.name = name
       self.age = age
person = Person("Alice", 25)
print(person.name)  # Output: Alice

2. Thuộc tính (Attributes)

  • Thuộc tính lớp (Class Attribute): Dùng chung cho tất cả đối tượng.
  • Thuộc tính đối tượng (Instance Attribute): Riêng của từng đối tượng.
class Car:
   # Class attribute
   wheels = 4
   def __init__(self, brand, model):
       # Instance attributes
       self.brand = brand
       self.model = model
car1 = Car("VinFast", "VF5")
print(car1.wheels)  # Output: 4 (Class attribute)
print(car1.brand)   # Output: VinFast (Instance attribute)

3. Phương thức (Methods)

  • Là các hàm được định nghĩa bên trong lớp.
  • Luôn có tham số self để truy cập thuộc tính của đối tượng.
class Circle:
   def __init__(self, radius):
       self.radius = radius
   def area(self):
       return 3.14 * self.radius ** 2
circle = Circle(5)
print(circle.area())  # Output: 78.5

IV. Kế thừa (Inheritance)

  • Cho phép một lớp con kế thừa thuộc tính và phương thức từ lớp cha.
class Animal:
   def __init__(self, name):
       self.name = name
   def speak(self):
       return "Âm thanh của động vật"
class Dog(Animal):  # Lớp Dog kế thừa từ Animal
   def speak(self):  # Ghi đè phương thức
       return f"{self.name} nói: Gâu gâu!"
dog = Dog("Bobby")
print(dog.speak())  # Output: Bobby nói: Gâu gâu!

V. Các phương thức đặc biệt (Magic/Dunder Methods)

  • Bắt đầu và kết thúc bằng __ (double underscore).
  • Ví dụ: __str__, __len__, __add__.
class Book:
   def __init__(self, title, pages):
       self.title = title
       self.pages = pages
   def __str__(self):
       return f"Book: {self.title}, Pages: {self.pages}"
   def __len__(self):
       return self.pages
book = Book("Python OOP", 300)
print(book)  # Output: Book: Python OOP, Pages: 300
print(len(book))  # Output: 300

VI. Bài tập thực hành

Bài 1: Tạo lớp SinhVien với các thuộc tính ten, tuoi, diem và phương thức display_info() in ra thông tin.

Bài 2: Tạo lớp Rectangle với phương thức tính diện tích và chu vi.

Bài 3: Tạo lớp BankAccount với phương thức deposit(), withdraw() và kiểm tra số dư.

VII. Tổng kết

  • Class là bản thiết kế, Object là thể hiện cụ thể.
  • __init__ dùng để khởi tạo đối tượng.
  • Kế thừa giúp tái sử dụng mã nguồn.
  • Magic Methods giúp định nghĩa các hành vi đặc biệt.

Lập trình hướng đối tượng giúp mã nguồn dễ quản lý, mở rộng và bảo trì hơn. 🚀