1. Class Method – Phương thức thuộc về lớp

Cái decorator @classmethod là một function decorator được tích hợp sẵn của Python, nó là một biểu thức mà được xử lý sau khi hàm của bạn được định nghĩa. Kết quả của phép xử lý biểu thức đó sẽ được phản chiếu lên phần code định nghĩa hàm của bạn. Một class method (phương thức/hàm thuộc về lớp nào đó) mà nhận vào một class khác làm đối số ngầm định đầu tiên, sẽ giống như một instance method (phương thức/hàm thuộc về một thể hiện/đối tượng của lớp nào đó) nhận vào một instance.

1. Cú pháp

class C(object):
    @classmethod
    def fun(cls, arg1, arg2, ...):

Trong đó:

fun: Là hàm mà cần chuyển đổi thành một class method

returns: một class method dành cho hàm này sẽ được trả về.

Một class method là một method – phương thức mà được gắn với class, mà không phải là gắn với đối tượng của class.

Các class methods có quyền truy cập đến trạng thái của class, bởi vì chúng đều nhận vào một tham số mà trỏ đến class, chứ không phải trỏ đến đối tượng/thể hiện.

Class method có thể thay đổi trạng thái của một class, và sự thay đổi này có thể tác động tới tất cả các thể hiện của class này. Ví dụ, nó có thể thay đổi một biến của class, trong khi biến này được sử dụng bởi tất cả các thể hiện của class.

2. Static method – Phương thức tĩnh

Static method không nhận vào đối số đầu tiên ngầm định nào.

1. Cú pháp

class C(object):
    @staticmethod
    def fun(arg1, arg2, ...):
        ...

Trong đó:

returns: Một static method dành cho hàm fun

Một static method là một method – phương thức mà được gắn với class, chứ không phải gắn với đối tượng của class.

Static method không thể truy cập hay sửa đổi trạng thái của class.

Static method hiện diện bên trong class bởi vì nó có ý nghĩa đối với method – phương thức có mặt trong class.

3. Class method và Static method

– Class method nhận vào cls làm tham số đầu tiên, trong khi static method không cần tới tham số đặc biệt nào.

– Class method có thể truy cập hoặc sửa đổi trạng thái của class, trong khi static method không thể truy cập tới hay sửa đổi nó.

– Nói chung, static method không biết gì về trạng thái của class. Chúng là những method – phương thức thuộc kiểu tiện ích, nhận vào một số tham số và làm việc trên các tham số đó. Mặt khác, class method phải có được một class làm tham số truyền vào cho nó.

– Chúng ta sử dụng cái decorator @classmethod trong Python để tạo ra một class method (phương thức/hàm thuộc về lớp) và sử dụng decorator @staticmethod để tạo ra một static method (phương thức/hàm tĩnh) trong Python.

4. Khi nào nên sử dụng cái nào?

Chúng ta thường sử dụng class method để tạo ra các factory methods. Các factory methods sẽ trả về đối tượng của lớp (tương tự như một hàm constructor) cho các trường hợp sử dụng khác nhau.

Chúng ta sẽ thường sử dụng các static methods để tạo ra các hàm tiện ích (utility functions).

5. Làm thế nào để khai báo class method và static method?

Để khai báo một class method trong Python, chúng ta sẽ sử dụng decorator @classmethod, và để khai báo một static method chúng ta sẽ sử dụng decorator @staticmethod.

Chúng ta cùng xem một ví dụ sau để hiểu được sự khác biệt giữa class method và static method. Giả sử, chúng ta muốn tạo ra một class Person. Lúc này, Python không hỗ trợ nạp chồng phương thức (method overloading) giống như C++ hoặc Java, vì vậy chúng ta sẽ sử dụng các class methods để tạo ra các factory methods. Trong ví dụ dưới đây, chúng ta sẽ sử dụng một class method để tạo ra một đối tượng person từ birth year (thông tin về năm sinh).

Như đã giải thích ở trên, chúng ta sẽ sử dụng các static methods để tạo ra các hàm tiện ích – utility functions. Trong ví dụ dưới đây, chúng ta sẽ sử dụng một static method để kiểm tra xem một person (người) có phải là adult (người lớn) hay không.

Đoạn chương trình Python mô tả cách sử dụng class method và static method

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python program to demonstrate  
# use of class method and static method. 
from datetime import date 
  
class Person: 
    def __init__(self, name, age): 
        self.name = name 
        self.age = age 
      
    # a class method to create a Person object by birth year. 
    @classmethod
    def fromBirthYear(cls, name, year): 
        return cls(name, date.today().year - year) 
      
    # a static method to check if a Person is adult or not. 
    @staticmethod
    def isAdult(age): 
        return age > 18
  
person1 = Person('mayank', 21) 
person2 = Person.fromBirthYear('mayank', 1996) 
  
print person1.age 
print person2.age 
  
# print the result 
print Person.isAdult(22) 

Kết quả in ra là:

21
21
True

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!