PHP
Python

Trang chủ

Lập trình hướng đối tượng trong Python: Class và Object

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
10/03/2025
20 phút đọc
Theo dõi Vietnix trên

Lập trình hướng đối tượng trong Python: Class và Object

Trong Python, class là khuôn mẫu để tạo ra các đối tượng (object), còn object là thể hiện cụ thể của một class. Hiểu rõ hai khái niệm này là nền tảng để bạn làm chủ lập trình hướng đối tượng (OOP) trong Python. Trong bài viết này, mình sẽ giúp bạn nắm vững cách tạo class, khởi tạo object, thao tác với thuộc tính và hiểu về cơ chế quản lý bộ nhớ của Python. Nếu bạn muốn xây dựng các ứng dụng có cấu trúc rõ ràng, dễ mở rộng và bảo trì, hãy cùng khám phá ngay!

Điểm chính cần nắm

  • Lập trình hướng đối tượng là gì? Lập trình hướng đối tượng (OOP) là một mô hình lập trình dựa trên các đối tượng, giúp tổ chức và quản lý mã nguồn hiệu quả hơn.
  • Lớp (Class) trong Python là gì? Lớp trong Python là một khuôn mẫu để tạo ra các đối tượng, xác định thuộc tính và phương thức mà đối tượng có thể sử dụng.
  • Cách tạo các lớp trong Python Hướng dẫn cách khai báo một lớp trong Python bằng từ khóa class, cùng với các phương thức khởi tạo và các thuộc tính.
  • Đối tượng (Object) trong Python là gì? Đối tượng là một thể hiện cụ thể của một lớp, có dữ liệu riêng và có thể thực hiện các hành vi được định nghĩa trong lớp.
  • Cách tạo các đối tượng trong Python Hướng dẫn cách khởi tạo đối tượng từ một lớp và sử dụng các phương thức, thuộc tính của đối tượng.
  • Truy cập thuộc tính của đối tượng trong Python Cách truy cập, thay đổi và sử dụng các thuộc tính của đối tượng trong Python.
    • Thêm, sửa hoặc xóa thuộc tính của đối tượng Cách thêm thuộc tính mới, cập nhật giá trị hoặc xóa thuộc tính khỏi một đối tượng.
    • Các hàm thao tác với thuộc tính đối tượng Một số hàm trong Python hữu ích để kiểm tra, lấy danh sách thuộc tính và thao tác với chúng.
  • Một số thuộc tính class được tích hợp sẵn trong Python Giới thiệu các thuộc tính đặc biệt như __dict__, __name__, __module__, giúp làm việc với lớp dễ dàng hơn.
  • Lớp tích hợp sẵn của các kiểu dữ liệu trong Python Python có nhiều lớp tích hợp sẵn cho các kiểu dữ liệu như int, str, list, dict, giúp xử lý dữ liệu nhanh chóng.
  • Garbage Collection trong Python Cơ chế thu gom rác trong Python giúp quản lý bộ nhớ tự động, giải phóng các đối tượng không còn được sử dụng.
  • Data Hiding – Ẩn dữ liệu trong Python Kỹ thuật che giấu dữ liệu trong Python bằng cách sử dụng thuộc tính riêng tư (private) và bảo vệ dữ liệu khỏi truy cập trái phép.
  • Tại sao Python vẫn cho phép truy cập? Dù hỗ trợ ẩn dữ liệu, Python vẫn cho phép truy cập gián tiếp qua các phương thức getter, setter hoặc sử dụng tên đặc biệt.
  • Vietnix – Giải pháp lưu trữ đáng tin cậy cho doanh nghiệp Giới thiệu dịch vụ máy chủ, VPS, hosting chất lượng cao của Vietnix, giúp doanh nghiệp tối ưu hiệu suất và bảo mật dữ liệu.

Lập trình hướng đối tượng là gì?

Python là một ngôn ngữ lập trình hướng đối tượng (OOP – Object-Oriented Programming), nghĩa là nó dựa trên nguyên tắc của mô hình lập trình hướng đối tượng. Trong Python, mọi thứ đều là đối tượng của một lớp nào đó, bao gồm cả các kiểu dữ liệu như số, chuỗi, list hay dictionary.

Mọi lớp trong Python, dù là lớp dựng sẵn hay do người dùng định nghĩa, đều kế thừa từ Object, lớp cơ sở chung của tất cả các lớp.

Class và Object trong Python
Class và Object trong Python

Lớp (Class) trong Python là gì?

Lớp (class) trong Python là một kiểu dữ liệu do người dùng định nghĩa, đóng vai trò như một khuôn mẫu để tạo ra các đối tượng. Lớp xác định dữ liệu mà đối tượng có thể chứa cũng như các hành vi mà nó có thể thực hiện.

Ví dụ, một lớp mô tả điện thoại thông minh có thể chứa dữ liệu như RAM, ROM, kích thước màn hình và các hành động như gọi điện, nhắn tin.

Cách tạo các lớp trong Python

Từ khóa class được sử dụng để tạo một lớp mới trong Python. Tên của lớp ngay lập tức theo sau từ khóa class, tiếp theo là dấu hai chấm như được hiển thị bên dưới:

class ClassName:
    'Chuỗi tài liệu mô tả lớp (tùy chọn)'
    class_suite  # Các thuộc tính và phương thức của lớp
  • Lớp có một chuỗi tài liệu (documentation string), có thể được truy cập qua ClassName.__doc__.
  • class_suite bao gồm tất cả các thành phần câu lệnh định nghĩa thành viên của lớp, các thuộc tính dữ liệu và các hàm.

Ví dụ:

Giả sử Vietnix muốn xây dựng một hệ thống quản lý khách hàng, ta có thể tạo một lớp Customer để biểu diễn thông tin của khách hàng.

class Customer:
    'Lớp quản lý thông tin khách hàng của Vietnix'
    customer_count = 0  # Biến lớp, dùng chung cho tất cả đối tượng
    
    def __init__(self, name, email, service):
        self.name = name
        self.email = email
        self.service = service
        Customer.customer_count += 1
    
    def display_customer(self):
        print(f"Tên: {self.name}, Email: {self.email}, Dịch vụ: {self.service}")

    def display_total_customers(self):
        print(f"Tổng số khách hàng: {Customer.customer_count}")

Giải thích:

  • customer_count: Biến lớp, dùng để đếm tổng số khách hàng, được chia sẻ giữa tất cả các đối tượng.
  • __init__(): Phương thức khởi tạo, nhận thông tin khách hàng (name, email, service) và tăng biến customer_count.
  • self.name, self.email, self.service: Các thuộc tính của từng đối tượng, lưu thông tin khách hàng.
  • display_customer(): Phương thức hiển thị thông tin khách hàng.
  • display_total_customers(): Phương thức hiển thị tổng số khách hàng, truy cập biến lớp customer_count.

 

Đối tượng (Object) trong Python là gì?

Đối tượng là một thể hiện (instance) cụ thể của một lớp. Khi một đối tượng được tạo từ một lớp, Python sẽ cấp phát bộ nhớ và khởi tạo các thuộc tính cho nó. Lớp chỉ đóng vai trò là khuôn mẫu, còn đối tượng chính là thực thể được tạo ra từ khuôn mẫu đó. Mỗi đối tượng có thể có dữ liệu riêng nhưng tuân theo cấu trúc do lớp quy định.

Ví dụ, trong sơ đồ bên dưới, Vehicle là một lớp, còn Car, Bus, SUV có thể là các đối tượng được tạo ra từ lớp Vehicle hoặc là các lớp con kế thừa từ nó.

image 370

Cách tạo các đối tượng trong Python

Đối tượng là một thể hiện (instance) của một lớp. Khi tạo một đối tượng từ một lớp, Python cấp phát bộ nhớ và khởi tạo thuộc tính cho nó. Để tạo các thực thể của một lớp, bạn gọi lớp sử dụng tên lớp và truyền vào các đối số mà phương thức __init__ của nó chấp nhận.

Ví dụ: Vietnix có hai khách hàng sử dụng dịch vụ.

# Lệnh này sẽ tạo một object đầu tiên của lớp Customer
cus1 = Customer("Nguyễn Văn A", "a@gmail.com", "VPS")
# Lệnh này sẽ tạo một object thứ hai của lớp Customer
cus2 = Customer("Trần Thị B", "b@gmail.com", "Hosting")

Truy cập thuộc tính của đối tượng trong Python

Trong Python, bạn có thể truy cập thuộc tính của đối tượng bằng toán tử dấu chấm (.).

  • Để truy cập thuộc tính của một đối tượng, sử dụng cú pháp: object.attribute_name.
  • Để truy cập biến lớp (class variable), sử dụng cú pháp: ClassName.variable_name.

Ví dụ:

cus1.display_customer()
cus2.display_customer()
Customer.display_total_customers(cus1)

Giải thích:

  • cus1.display_customer()cus2.display_customer() gọi phương thức của đối tượng để hiển thị thông tin khách hàng.
  • Customer.display_total_customers(cus1) truy cập phương thức của lớp để hiển thị tổng số khách hàng.

Kết quả:

Tên: Nguyễn Văn A, Email: a@gmail.com, Dịch vụ: VPS
Tên: Trần Thị B, Email: b@gmail.com, Dịch vụ: Hosting
Tổng số khách hàng: 2

Thêm, sửa hoặc xóa thuộc tính của đối tượng

Sau khi tạo một đối tượng, bạn có thể thay đổi thuộc tính của nó như ví dụ bên dưới:

# Thêm thuộc tính mới
cus1.phone = "18001093"  

# Sửa giá trị thuộc tính
cus1.phone = "0123456789"  

# Xóa thuộc tính
del cus1.phone  

Các hàm thao tác với thuộc tính đối tượng

Thay vì truy cập trực tiếp, bạn có thể sử dụng các hàm tích hợp sẵn:

  • getattr(obj, name[, default]) – Lấy giá trị thuộc tính.
  • hasattr(obj, name) – Kiểm tra thuộc tính có tồn tại hay không.
  • setattr(obj, name, value) – Gán giá trị cho thuộc tính (nếu chưa có thì tạo mới).
  • delattr(obj, name) – Xóa thuộc tính.

Ví dụ: Các phương thức này giúp thao tác với thuộc tính linh hoạt hơn, đặc biệt khi làm việc với các đối tượng có thuộc tính không cố định.

# Kiểm tra xem thuộc tính 'phone' có tồn tại không
print(hasattr(cus1, 'phone'))  

# Lấy giá trị thuộc tính 'name'
print(getattr(cus1, 'name'))    

# Gán giá trị mới cho thuộc tính 'phone'
setattr(cus1, 'phone', "0123456789")  

# Xóa thuộc tính 'phone'
delattr(cus1, 'phone')   

Một số thuộc tính class được tích hợp sẵn trong Python

Mọi lớp trong Python đều có một số thuộc tính tích hợp sẵn, có thể truy cập bằng toán tử dấu chấm (.) giống như các thuộc tính khác.

STTThuộc tínhMô tả
1__dict__Dictionary chứa namespace của lớp (bao gồm tất cả các thuộc tính và phương thức của lớp).
2__doc__Chuỗi tài liệu của lớp (docstring), hoặc None nếu không được định nghĩa.
3__name__Tên của lớp.
4__module__Tên module chứa định nghĩa của lớp. Nếu chạy trong chế độ tương tác, giá trị này là "__main__".
5__bases__Một tuple chứa danh sách các lớp cha (nếu có) theo thứ tự kế thừa.

Ví dụ: Đối với lớp Customer ở trên, hãy thử truy cập các thuộc tính của nó.

class Customer:
    """Lớp quản lý khách hàng của Vietnix"""
    customer_count = 0

    def __init__(self, name, email, service):
        self.name = name
        self.email = email
        self.service = service
        Customer.customer_count += 1

    def display_customer(self):
        print(f"Tên: {self.name}, Email: {self.email}, Dịch vụ: {self.service}")

    @classmethod
    def display_total_customers(cls):
        print(f"Tổng số khách hàng: {cls.customer_count}")

# Kiểm tra các thuộc tính tích hợp sẵn
print("Customer.__doc__:", Customer.__doc__)      # Lấy docstring của lớp
print("Customer.__name__:", Customer.__name__)    # Lấy tên lớp
print("Customer.__module__:", Customer.__module__)# Lấy tên module chứa lớp
print("Customer.__bases__:", Customer.__bases__)  # Xem danh sách lớp cha
print("Customer.__dict__:", Customer.__dict__)    # Xem namespace của lớp

Kết quả:

Customer.__doc__: Lớp quản lý khách hàng của Vietnix
Customer.__name__: Customer
Customer.__module__: __main__
Customer.__bases__: ()
Customer.__dict__: {“__module__”: “__main__”, “__doc__”: “Lớp quản lý khách hàng của Vietnix”,
“customer_count”: 0, “__init__”: <function Customer.__init__ at 0x7f7c4a4c1f70>,
“display_customer”: <function Customer.display_customer at 0x7f7c4a4c2040>,
“display_total_customers”: <function Customer.display_total_customers at 0x7f7c4a4c20d0>}

Lớp tích hợp sẵn của các kiểu dữ liệu trong Python

Python là một ngôn ngữ lập trình hướng đối tượng, trong đó mọi dữ liệu đều là một đối tượng thuộc về một lớp nhất định. Các kiểu dữ liệu như chuỗi, danh sách, số nguyên, số thực,… đều thuộc về các lớp tích hợp sẵn trong Python. Để kiểm tra một kiểu dữ liệu thuộc về lớp nào, ta có thể sử dụng hàm type(). Hàm này nhận vào một giá trị và trả về lớp tương ứng của giá trị đó.

Ví dụ kiểm tra lớp tích hợp sẵn của các kiểu dữ liệu trong hệ thống Vietnix:

# Số lượng khách hàng của Vietnix
customer_count = 500  
print(type(customer_count))  # Kiểu int

# Doanh thu trung bình của khách hàng
avg_revenue = 149.99  
print(type(avg_revenue))  # Kiểu float

# Tên dịch vụ phổ biến
service_name = "VPS Pro"  
print(type(service_name))  # Kiểu str

# Danh sách khách hàng VIP
vip_customers = {"Nguyen Van A": "VPS", "Tran Thi B": "Hosting"}
print(type(vip_customers))  # Kiểu dict

# Hàm thông báo khuyến mãi
def notify_promotion():
    print("Khách hàng Vietnix nhận ưu đãi 20% khi gia hạn dịch vụ!")
print(type(notify_promotion))  # Kiểu function

Kết quả: Khi bạn thực thi mã này, nó sẽ hiển thị các lớp tương ứng của các kiểu dữ liệu Python.

<class ‘int’>
<class ‘float’>
<class ‘str’>
<class ‘dict’>
<class ‘function’>

Garbage Collection trong Python

Trong Python, bộ thu gom rác (Garbage Collection – GC) tự động giải phóng bộ nhớ bằng cách xóa các đối tượng không còn được sử dụng. Khi một đối tượng không còn tham chiếu nào trỏ đến nó, Python sẽ thu hồi bộ nhớ của đối tượng đó để tối ưu hiệu suất.

Cách hoạt động của Garbage Collection

  • Tham chiếu tăng: Khi một biến trỏ đến một đối tượng, số lượng tham chiếu (reference count) của đối tượng đó tăng lên.
  • Tham chiếu giảm: Khi một biến bị xóa, gán lại giá trị khác hoặc vượt ra khỏi phạm vi sử dụng, số lượng tham chiếu giảm đi.
  • Thu gom bộ nhớ: Khi số lượng tham chiếu giảm về 0, Python sẽ tự động xóa đối tượng và thu hồi bộ nhớ.

Ví dụ:

# Create object <40>
a = 40      
# Increase ref. count  of <40> 
b = a       
# Increase ref. count  of <40> 
c = [b]     

# Decrease ref. count  of <40>
del a       
# Decrease ref. count  of <40>
b = 100      
# Decrease ref. count  of <40>
c[0] = -1    

Trong đoạn mã trên:

  • a = 40 tạo một đối tượng có giá trị 40.
  • b = ac = [b] làm tăng số lượng tham chiếu đến 40.
  • Khi del a, b = 100c[0] = -1, số lượng tham chiếu đến 40 giảm dần về 0, Python sẽ tự động thu hồi bộ nhớ của đối tượng này.

Destructor (__del__()) trong Python

Trong Python, Garbage Collector sẽ tự động giải phóng bộ nhớ của các đối tượng không còn được sử dụng. Tuy nhiên, trong một số trường hợp, bạn có thể cần thực hiện các tác vụ dọn dẹp trước khi đối tượng bị hủy, chẳng hạn như đóng kết nối cơ sở dữ liệu hoặc giải phóng tài nguyên bên ngoài. Python cung cấp phương thức đặc biệt __del__(), còn gọi là destructor, để xử lý các công việc dọn dẹp này. Phương thức __del__() được tự động gọi khi một đối tượng sắp bị hủy.

Ví dụ dưới đây minh họa cách hệ thống Vietnix quản lý khách hàng và thực hiện dọn dẹp khi một khách hàng bị xóa khỏi hệ thống:

class Customer:
    def __init__(self, name, service):
        self.name = name
        self.service = service

    def __del__(self):
        print(f"Khách hàng {self.name} đã bị xóa khỏi hệ thống.")

# Tạo đối tượng khách hàng
cus1 = Customer("Nguyễn Văn A", "VPS")
cus2 = cus1  # Tăng số lượng tham chiếu
cus3 = cus1  # Tăng số lượng tham chiếu

# Hiển thị ID của các đối tượng
print(id(cus1), id(cus2), id(cus3))

# Xóa từng tham chiếu
del cus1  
del cus2  
del cus3  

Kết quả: Khi thực thi, mã trên sẽ tạo ra kết quả sau.

140547909234448 140547909234448 140547909234448
Khách hàng Nguyễn Văn A đã bị xóa khỏi hệ thống.

Data Hiding – Ẩn dữ liệu trong Python

Trong Python, bạn có thể ẩn dữ liệu bằng cách đặt tên thuộc tính với hai dấu gạch dưới (__) ở đầu. Khi đó, Python sẽ tự động thay đổi tên thuộc tính để ngăn chặn việc truy cập trực tiếp từ bên ngoài lớp, giúp bảo vệ dữ liệu quan trọng. Việc này đặc biệt hữu ích khi bạn muốn kiểm soát cách dữ liệu được truy cập và chỉnh sửa, thay vì để chúng bị thay đổi tùy ý từ bên ngoài.

Ví dụ: Giả sử Vietnix có một hệ thống quản lý khách hàng, trong đó số dư tài khoản của khách hàng cần được bảo vệ để tránh bị truy cập hoặc chỉnh sửa ngoài ý muốn.

class CustomerAccount:
    __balance = 0  # Thuộc tính được bảo vệ

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"Nạp thành công: {amount} VNĐ")
    
    def get_balance(self):
        return self.__balance

# Tạo tài khoản khách hàng
account = CustomerAccount()

# Nạp tiền vào tài khoản
account.deposit(500000)
account.deposit(300000)

# Thử truy cập trực tiếp số dư
print(account.__balance)  # Lỗi!

# Truy cập bằng cách gián tiếp
print(account._CustomerAccount__balance)  # Vẫn có thể truy cập

Kết quả: Khi code trên được thực thi, nó tạo ra kết quả sau.

Nạp thành công: 500000 VNĐ
Nạp thành công: 300000 VNĐ
Traceback (most recent call last):
File “”, line 12, in
AttributeError: ‘CustomerAccount’ object has no attribute ‘__balance’
Truy cập bằng cách gián tiếp
800000

Tại sao Python vẫn cho phép truy cập?

Python không thực sự ngăn chặn hoàn toàn việc truy cập vào các thuộc tính có tiền tố __, mà chỉ đổi tên nội bộ (name mangling) bằng cách thêm tên lớp vào trước. Điều này có nghĩa là bạn vẫn có thể truy cập chúng bằng cách sử dụng cú pháp:

object._ClassName__attributeName

Tuy nhiên, cách làm này không được khuyến khích vì nó phá vỡ tính đóng gói trong lập trình hướng đối tượng. Thay vì truy cập trực tiếp, bạn nên sử dụng phương thức getter như get_balance() để lấy giá trị của thuộc tính một cách an toàn.

Ví dụ:

print(account._CustomerAccount__balance)  

Kết quả: Khi mã trên được thực thi, nó tạo ra kết quả bên dưới.

Nạp thành công: 500000 VNĐ
Nạp thành công: 300000 VNĐ
Traceback (most recent call last):
File “<main.py>”, line 12, in <module>
AttributeError: ‘CustomerAccount’ object has no attribute ‘__balance’

# Truy cập bằng cách gián tiếp
800000

Giải thích:

  • Khi gọi print(account.__balance), Python sẽ báo lỗi AttributeError__balance đã bị đổi tên nội bộ.
  • Nhưng khi gọi print(account._CustomerAccount__balance), ta vẫn có thể truy cập được giá trị 800000 (tổng tiền đã nạp).

Vietnix – Giải pháp lưu trữ đáng tin cậy cho doanh nghiệp

Vietnix là đơn vị tiên phong trong lĩnh vực thuê server, hosting, VPS, domain, cung cấp giải pháp lưu trữ ổn định – bảo mật – tốc độ cao. Với hệ thống hạ tầng mạnh mẽ và đội ngũ kỹ thuật hỗ trợ 24/7, Vietnix giúp doanh nghiệp vận hành trơn tru, tối ưu hiệu suất và bảo vệ dữ liệu an toàn. Hơn 80.000 khách hàng đã tin tưởng lựa chọn Vietnix nhờ dịch vụ chuyên nghiệp và cam kết chất lượng vượt trội. Nếu bạn đang tìm kiếm một giải pháp máy chủ mạnh mẽ, đáng tin cậy, Vietnix chính là lựa chọn phù hợp.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 18001093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.

Câu hỏi thường gặp

Class và Object trong Python khác nhau như thế nào?

Class là khuôn mẫu để tạo ra các object, còn object là thể hiện cụ thể của class.

Có thể tạo object mà không cần class không?

Không, object phải được tạo từ một class, ngoại trừ các kiểu dữ liệu cơ bản như số, chuỗi, danh sách,… vốn là object của class có sẵn trong Python.

Một class có thể có bao nhiêu object?

Không giới hạn. Bạn có thể tạo nhiều object từ cùng một class.

Python có hỗ trợ tính kế thừa không?

. Python cho phép một class kế thừa từ một hoặc nhiều class khác để tái sử dụng và mở rộng tính năng.

Lời kết

Nắm vững class và object là bước đầu tiên để bạn thành thạo lập trình hướng đối tượng trong Python. Khi hiểu cách tạo, thao tác và quản lý đối tượng, bạn có thể xây dựng các chương trình linh hoạt, dễ bảo trì hơn. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới, mình sẽ hỗ trợ nhanh nhất. Cảm ơn bạn đã đọc!

Mọi người cũng xem:

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn