Hàm classmethod là một hàm thuộc loại Function decorator trong các Built-in Functions của ngôn ngữ lập trình Python được sử dụng để để biến một phương thức thành một phương thức lớp (class method).
Phương thức lớp có thể truy cập và thao tác với các biến lớp (class variables) và thường được sử dụng để thực hiện hoặc làm việc liên quan đến lớp chứ không phụ thuộc vào một đối tượng cụ thể của lớp đó.
1. Phương thức của lớp (class method)
Phương thức của lớp (class method) trong lập trình hướng đối tượng trong Python là một loại phương thức đặc biệt mà bạn định nghĩa bên trong một lớp và nó được gắn với lớp chứ không phải với từng đối tượng cụ thể của lớp đó.
Cú pháp để định nghĩa một phương thức lớp trong Python sử dụng decorator @classmethod
:
class MyClass:
@classmethod
def class_method(cls, args):
# Code của phương thức
Trong đó:
class_method
là tên của phương thức lớp.@classmethod
là decorator để xác định phương thức lớp.cls
là tham số đại diện cho lớp chính (class) và thường được đặt tên làcls
. Thông thường, người ta sử dụngcls
để truy cập các thuộc tính và phương thức của lớp.
Phương thức lớp có thể truy cập vào và thao tác với các biến lớp (class variables) và có thể tạo ra các thực thể (instances) mới của lớp. Đặc điểm chính của phương thức lớp là nó hoạt động trên toàn bộ lớp chứ không phụ thuộc vào một đối tượng cụ thể nào. Điều này giúp chia sẻ logic xử lý chung giữa tất cả các đối tượng của lớp.
2. Cú pháp hàm classmethod
Cú pháp:
class MyClass:
@classmethod
def class_method(cls, args):
# Code của phương thức
Trong đó:
class_method
: Tên của phương thức lớp.
@classmethod
: Decorator cho biết phương thức này là một phương thức lớp.
Tham số:
cls
: Đại diện cho lớp (class) chính. Bình thường, người ta đặt tên làcls
để biểu thị rõ đây là phương thức lớp.
Phiên bản Python:
- Hàm @classmethod đã được hỗ trợ từ Python 2.2.
Mục đích chính:
- Tạo một phương thức cho lớp (class method) thay vì cho mỗi đối tượng (instance) riêng lẻ. Phương thức lớp có thể được gọi trên lớp chính và được chia sẻ chung giữa tất cả các đối tượng thuộc lớp đó.
3. Ví dụ minh họa
Dưới đây là một số ví dụ minh họa cách sử dụng function decorator classmethod ngôn ngữ lập trình Python:
3.1. Sử dụng @classmethod để theo dõi số lượng đối tượng được tạo
class MyClass:
count = 0 # Biến lớp để theo dõi số lượng đối tượng được tạo
def __init__(self):
MyClass.count += 1 # Mỗi lần khởi tạo đối tượng, tăng biến lớp count lên 1
@classmethod
def get_count(cls):
return cls.count # Trả về số lượng đối tượng đã tạo
# Tạo đối tượng
obj1 = MyClass()
obj2 = MyClass()
obj3 = MyClass()
# Gọi phương thức lớp để lấy số lượng đối tượng đã tạo
print(MyClass.get_count()) # Output: 3
Giải thích:
- Chúng ta định nghĩa lớp
MyClass
với một biến lớpcount
để theo dõi số lượng đối tượng được tạo.
- Trong phương thức khởi tạo
__init__
, mỗi lần khởi tạo đối tượng, biến lớpcount
được tăng lên 1. - Phương thức
get_count
được đánh dấu bằng decorator@classmethod
và trả về giá trị của biến lớpcount
. - Chúng ta tạo và khởi tạo một số đối tượng từ lớp
MyClass
, sau đó gọiMyClass.get_count()
để lấy số lượng đối tượng đã tạo.
2. Sử dụng @classmethod để tạo một phương thức tạo mới
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
# Tính toán tuổi từ năm sinh
age = 2023 - birth_year
return cls(name, age)
# Sử dụng phương thức tạo mới từ năm sinh
person1 = Person.from_birth_year("Alice", 1990)
print(f"Person 1: {person1.name}, {person1.age} years old.")
Giải thích:
- Chúng ta định nghĩa lớp
Person
với một phương thức khởi tạo thông thường__init__
nhận tên và tuổi.
- Chúng ta định nghĩa một phương thức tạo mới
from_birth_year
bằng cách sử dụng decorator@classmethod
. Phương thức này lấy tên và năm sinh, sau đó tính toán tuổi từ năm sinh. - Phương thức tạo mới này trả về một đối tượng
Person
với tên và tuổi được tính toán từ năm sinh. - Chúng ta tạo một đối tượng
person1
bằng cách gọi phương thức tạo mớiPerson.from_birth_year
và in thông tin về người này.