/Hàm classmethod – Built-in Functions

Hàm classmethod – Built-in Functions

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ụng cls để 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.

Hàm classmethod – Built-in Functions

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ớp count để 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ớp count đượ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ớp count.
  • Chúng ta tạo và khởi tạo một số đối tượng từ lớp MyClass, sau đó gọi MyClass.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ới Person.from_birth_year và in thông tin về người này.