PHP
Python

Trang chủ

Class Methods trong Python: Hướng dẫn chi tiết từ cơ bản đến nâng cao

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
08/03/2025
14 phút đọc
Theo dõi Vietnix trên

Class Methods trong Python: Hướng dẫn chi tiết từ cơ bản đến nâng cao

Class Method là một phương thức thuộc về lớp thay vì đối tượng cụ thể, cho phép truy cập và thao tác với các thuộc tính lớp mà không cần khởi tạo instance. Đây là một tính năng quan trọng giúp quản lý dữ liệu chung giữa các đối tượng một cách hiệu quả. Trong bài viết này, bạn sẽ tìm hiểu cách tạo Class Method bằng classmethod() và decorator @classmethod, cách truy cập thuộc tính lớp, cũng như cách thêm hoặc xóa Class Method động trong Python.

Class Methods trong Python là gì?

Trong Python, method là các hàm được định nghĩa bên trong class và dùng để thao tác với dữ liệu của class đó. Python có ba loại method chính:

  • Instance method: Gắn với từng đối tượng cụ thể, có thể truy cập và thay đổi dữ liệu của instance.
  • Class method: Gắn với class, không phụ thuộc vào instance mà thao tác trực tiếp với dữ liệu.
  • Static method: Thuộc về class nhưng không thể truy cập hoặc thay đổi dữ liệu của class.
Class Methods trong Python
Class Methods trong Python

Điểm khác biệt quan trọng giữa class method và static method là class method có tham số cls, cho phép nó truy cập và thay đổi trạng thái của class. Class method có thể được gọi trực tiếp từ class thay vì thông qua một instance. Điều này giúp chúng hữu ích khi cần thao tác trên dữ liệu chung của class thay vì dữ liệu của từng instance cụ thể.

Ngược lại, instance method có thể truy cập cả biến instance và biến class, trong khi static method chỉ hoạt động như một hàm độc lập bên trong class mà không có quyền truy cập vào dữ liệu.

Sự khác biệt giữa Class Method, Instance Method và Static Method

Loại phương thứcCách định nghĩaTruy cập thuộc tínhCần instance để gọi?
Instance Methoddef method(self)Thuộc tính của instance (self)
Class Method@classmethod def method(cls)Thuộc tính của class (cls)Không
Static Method@staticmethod def method()Không có self hay clsKhông
Class Method, Instance Method và Static Method

Ví dụ:

class Example:
    class_attr = "Class Attribute"
    
    def instance_method(self):
        return "Instance Method"
    
    @classmethod
    def class_method(cls):
        return f"Class Method: {cls.class_attr}"
    
    @staticmethod
    def static_method():
        return "Static Method"

Cách tạo Class Method trong Python

Có hai cách để tạo phương thức lớp trong Python:

  • Sử dụng hàm classmethod()
  • Sử dụng decorator@classmethod

Sử dụng hàm classmethod()

Python cung cấp hàm tích hợp sẵn classmethod() để chuyển đổi một instance method thành class method. Khi đó, method có thể được gọi trực tiếp từ class mà không cần thông qua instance.

Cú pháp:

classmethod(instance_method)

# Trong đó:
# instance_method là method của instance cần chuyển đổi thành class method.

Ví dụ:

Giả sử Vietnix muốn theo dõi số lượng server đang có. Chúng ta sẽ sử dụng classmethod() để cho phép lấy số lượng server từ class mà không cần tạo instance.

class VietnixServer:
    server_count = 0  # Biến class lưu số lượng server

    def __init__(self, name):
        self.name = name
        VietnixServer.server_count += 1

    # Instance method
    def show_count(self):
        print(self.server_count)

# Chuyển đổi thành class method
VietnixServer.count_servers = classmethod(VietnixServer.show_count)

# Tạo server mới
s1 = VietnixServer("Server 1")
s2 = VietnixServer("Server 2")
s3 = VietnixServer("Server 3")

s1.show_count()           # Gọi qua instance
VietnixServer.count_servers()  # Gọi qua class

Kết quả:

3
3

Giải thích:

  1. show_count() ban đầu là một instance method, có thể truy cập thông qua instance (s1.show_count()).
  2. VietnixServer.count_servers = classmethod(VietnixServer.show_count) giúp biến show_count() thành class method.
  3. Giờ đây, có thể gọi count_servers() trực tiếp từ class (VietnixServer.count_servers()), mà không cần tạo một instance của VietnixServer.

Sử dụng decorator @classmethod

Python cung cấp decorator @classmethod để định nghĩa class method một cách trực quan và dễ hiểu hơn so với việc sử dụng classmethod(). Khi dùng @classmethod, method có thể được gọi trực tiếp từ class mà không cần tạo instance. Trong class method, tham số cls đại diện cho class, cho phép truy cập vào các thuộc tính và method của class.

Cú pháp:

class ClassName:
    @classmethod
    def method_name(cls):
        # Code xử lý

Ví dụ: Quản lý số lượng server của Vietnix

Vietnix cần theo dõi số lượng server đang hoạt động. Thay vì chỉ cho phép kiểm tra số lượng qua instance, ta sẽ dùng @classmethod để có thể gọi trực tiếp từ class.

class VietnixServer:
    server_count = 0  # Biến class lưu số lượng server

    def __init__(self, name):
        self.name = name
        VietnixServer.server_count += 1

    # Class method để hiển thị số lượng server
    @classmethod
    def show_count(cls):
        print(f"Số lượng server hiện có: {cls.server_count}")

# Tạo các server mới
s1 = VietnixServer("Server 1")
s2 = VietnixServer("Server 2")
s3 = VietnixServer("Server 3")

s1.show_count()         # Gọi qua instance
VietnixServer.show_count()  # Gọi trực tiếp từ class

Kết quả:

Số lượng server hiện có: 3
Số lượng server hiện có: 3

Giải thích:

  1. show_count() là một class method, nhờ decorator @classmethod nên có thể gọi trực tiếp từ class mà không cần instance.
  2. cls.server_count giúp truy cập biến class server_count.
  3. Cả s1.show_count()VietnixServer.show_count() đều cho kết quả giống nhau, giúp việc quản lý server linh hoạt hơn.

Truy cập thuộc tính lớp trong Class Method

Thuộc tính lớp (class attributes) là các biến thuộc về một lớp, có giá trị được chia sẻ giữa tất cả các đối tượng của lớp đó. Trong class method, bạn có thể truy cập thuộc tính lớp bằng cách sử dụng tham số cls, theo sau là dấu . và tên thuộc tính.

Ví dụ: Quản lý giá server của Vietnix

Giả sử Vietnix có một danh sách các server và mỗi server có một mức giá cố định. Ta sẽ dùng class method để truy cập và cập nhật giá server.

class VietnixServer:
    # Thuộc tính lớp: giá mặc định của server
    server_price = 5000000  

    def __init__(self, name):
        self.name = name

    # Class method để hiển thị giá server
    @classmethod
    def show_price(cls):
        print(f"Giá mỗi server hiện tại: {cls.server_price} VNĐ")

    # Class method để cập nhật giá server
    @classmethod
    def update_price(cls, new_price):
        cls.server_price = new_price
        print(f"Giá server đã được cập nhật thành: {cls.server_price} VNĐ")

# Truy xuất giá server
VietnixServer.show_price()

# Cập nhật giá server
VietnixServer.update_price(6000000)

# Kiểm tra lại giá sau khi cập nhật
VietnixServer.show_price()

Kết quả:

Giá mỗi server hiện tại: 5000000 VNĐ
Giá server đã được cập nhật thành: 6000000 VNĐ
Giá mỗi server hiện tại: 6000000 VNĐ

Giải thích:

  • server_pricethuộc tính lớp, được chia sẻ giữa tất cả các instance của VietnixServer.
  • @classmethod show_price(cls) giúp lấy giá hiện tại của server.
  • @classmethod update_price(cls, new_price) cho phép cập nhật giá mới và thay đổi giá trị của server_price trên toàn bộ class.
  • Khi gọi VietnixServer.update_price(6000000), giá trị server_price được cập nhật, và khi gọi lại show_price(), giá đã thay đổi.

Thêm Class Method bằng setattr()

Trong Python, bạn có thể thêm một class method vào class một cách động bằng cách sử dụng hàm setattr(). Điều này giúp mở rộng chức năng của class mà không cần chỉnh sửa mã nguồn ban đầu. Hàm setattr() trong Python dùng để thiết lập hoặc thêm thuộc tính một cách linh hoạt. Nếu muốn thêm một class method vào một lớp, ta có thể truyền tên phương thức như một tham số cho setattr().

Cú pháp:

setattr(cls, name, function)

# Trong đó:
# cls: Class cần thêm method.
# name: Tên của method mới (chuỗi).
# function: Hàm sẽ được gán làm method của class.

Ví dụ: Thêm class method vào class bằng setattr()

Giả sử class VietnixServer không có phương thức hiển thị thương hiệu ban đầu. Ta sẽ thêm phương thức này một cách động bằng setattr().

class VietnixServer:
    pass

# Định nghĩa class method
@classmethod
def brandName(cls):
    print("Vietnix - Giải pháp server chất lượng cao")

# Thêm phương thức brandName() vào class VietnixServer
setattr(VietnixServer, "show_brand", brandName)

# Tạo đối tượng từ class
server = VietnixServer()
server.show_brand()

Kết quả:

Vietnix – Giải pháp server chất lượng cao

Giải thích:

  • Ban đầu, VietnixServer không có phương thức show_brand().
  • Ta định nghĩa một class method brandName(cls), in ra thương hiệu Vietnix.
  • Dùng setattr(VietnixServer, "show_brand", brandName) để gán brandName() thành phương thức của VietnixServer.
  • Gọi server.show_brand() để kiểm tra phương thức vừa thêm.

Xóa Class Method bằng del

Toán tử del trong Python được sử dụng để xóa một phương thức lớp một cách linh hoạt. Nếu bạn cố gắng truy cập phương thức đã bị xóa, mã sẽ phát sinh lỗi AttributeError.

Cú pháp:

del ClassName.method_name

# Trong đó:
# ClassName: Tên của class chứa method cần xóa.
# method_name: Tên của method cần xóa.

Ví dụ:

Trong ví dụ dưới đây, chúng ta đang xóa phương thức lớp có tên là “brand_info()” bằng cách sử dụng toán tử del:

class VietnixServer:
    @classmethod
    def brand_info(cls):
        print("Vietnix - Dịch vụ máy chủ chất lượng cao")

# Gọi phương thức trước khi xóa
VietnixServer.brand_info()

# Xóa phương thức brand_info()
del VietnixServer.brand_info

# Kiểm tra xem phương thức còn tồn tại không
try:
    VietnixServer.brand_info()
except AttributeError:
    print("Phương thức brand_info đã bị xóa!")

Kết quả:

Vietnix – Dịch vụ máy chủ chất lượng cao
Phương thức brand_info đã bị xóa!

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

Giải thích:

  • Class VietnixServer có một class method brand_info() để in thông tin thương hiệu.
  • del VietnixServer.brand_info được sử dụng để xóa phương thức khỏi class.
  • Khi thử gọi lại VietnixServer.brand_info(), chương trình sẽ báo lỗi AttributeError, cho thấy phương thức đã bị xóa thành công.

Vietnix – Giải pháp lưu trữ tốc độ cao, an toàn và đáng tin cậy

Vietnix là một trong những nhà cung cấp dịch vụ thuê máy chủ (server), hosting, VPS, domain hàng đầu tại Việt Nam. Với sứ mệnh mang đến giải pháp lưu trữ hiệu quả, bảo mật vượt trội, Vietnix cam kết cung cấp dịch vụ chất lượng cao cùng đội ngũ hỗ trợ kỹ thuật 24/7. Hơn 80.000 khách hàng đã tin tưởng lựa chọn Vietnix nhờ vào dịch vụ máy chủ mạnh mẽ, giúp tối ưu hóa hiệu suất và bảo vệ dữ liệu an toàn tuyệt đối cho doanh nghiệ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

Khi nào nên sử dụng Class Method?

Khi cần một phương thức hoạt động trên lớp thay vì trên từng đối tượng.
Khi muốn tạo constructor thay thế (alternative constructor) để khởi tạo đối tượng theo một cách khác.
Khi cần thay đổi hoặc truy cập các thuộc tính lớp.

Có thể thêm Class Method vào một lớp sau khi đã định nghĩa không?

Có, ta có thể sử dụng hàm setattr() để thêm Class Method vào một lớp sau khi lớp đã được định nghĩa. Điều này hữu ích khi muốn mở rộng chức năng của một lớp một cách linh hoạt mà không cần chỉnh sửa trực tiếp trong mã nguồn.
Ví dụ:
class Server:
pass # Lớp rỗng
Định nghĩa Class Method
@classmethod
def server_info(cls):
print("Vietnix cung cấp dịch vụ máy chủ chất lượng cao.")
Thêm phương thức vào lớp bằng setattr()
setattr(Server, "get_info", server_info)
Gọi phương thức mới
Server.get_info() # Output: Vietnix cung cấp dịch vụ máy chủ chất lượng cao.

Có thể xóa Class Method sau khi đã thêm vào lớp không?

Có, bạn có thể sử dụng câu lệnh del để xóa một Class Method khỏi lớp. Nếu cố gắng gọi phương thức sau khi xóa, Python sẽ báo lỗi AttributeError.
Ví dụ:
class Server: @classmethod def server_info(cls): print("Vietnix cung cấp dịch vụ máy chủ chất lượng cao.") # Xóa phương thức khỏi lớp del Server.server_info # Gọi phương thức sau khi xóa (sẽ gây lỗi) Server.server_info() # AttributeError: type object 'Server' has no attribute 'server_info'

Ở đây, server_info đã bị xóa khỏi lớp Server, nên khi gọi phương thức, chương trình sẽ báo lỗi.

Lời kết

Class Method là một công cụ mạnh mẽ giúp tổ chức mã nguồn tốt hơn và tối ưu hiệu suất khi làm việc với dữ liệu cấp lớp. Qua bài viết, bạn đã nắm được cách khai báo, sử dụng và quản lý Class Method linh hoạt trong Python. 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 hỗ trợ nhanh nhất. Cảm ơn bạn đã đọc!

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