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.

Đ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ức | Cách định nghĩa | Truy cập thuộc tính | Cần instance để gọi? |
---|---|---|---|
Instance Method | def method(self) | Thuộc tính của instance (self ) | Có |
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 cls | Không |
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:
show_count()
ban đầu là một instance method, có thể truy cập thông qua instance (s1.show_count()
).VietnixServer.count_servers = classmethod(VietnixServer.show_count)
giúp biếnshow_count()
thành class method.- 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ủaVietnixServer
.
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:
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.cls.server_count
giúp truy cập biến classserver_count
.- Cả
s1.show_count()
và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_price
là thuộc tính lớp, được chia sẻ giữa tất cả các instance củaVietnixServer
.@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ủaserver_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ạishow_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ứcshow_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ánbrandName()
thành phương thức củaVietnixServer
. - 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 methodbrand_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ỗiAttributeError
, 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!