1. Class Method – Các hàm/phương thức thuộc về class

Trong Python, decorator @classmethod là một function decorator (decorator dành cho hàm) được tích hợp sẵn, nó là một biểu thức được đánh giá sau khi hàm của bạn được định nghĩa. Kết quả của việc đánh giá đó sẽ được áp dụng lên phần code định nghĩa hàm.

Một class method sẽ nhận vào chính class (mà nó nằm bên trong class đó) làm đối số ngầm định đầu tiên (implicit first argument), điều này giống như khi một instance method (hàm/phương thức thuộc về một đối tượng hay một thể hiện) nhận vào một cách ngầm định chính cái instance (đối tượng/thể hiện) mà nó thuộc về.

Cú pháp

class C(object):
    @classmethod
    def fun(cls, arg1, arg2, ...):
       ....
fun: function that needs to be converted into a class method
returns: a class method for function.

– Một class method là một method được ràng buộc với class chứ không phải với đối tượng của class.

– Chúng có quyền truy cập vào trạng thái của class, bởi vì các class method sẽ nhận vào một class parameter (tham số truyền vào hàm thuộc kiểu class) mà trỏ đến chính class mà nó thuộc về, chứ không phải nhận vào một thể hiện/đối tượng của class.

– Các class method có thể chỉnh sửa trạng thái của một class, và những thay đổi này sẽ được áp dụng cho tất cả các đối tượng/thể hiện của class đó. Ví dụ, nó có thể sửa đổi một biến của class, và biến đã được chỉnh sửa này sẽ có thể được áp dụng cho tất cả các đối tượng/thể hiện.

2. Static Method

Trong Python, các Static Method sẽ không nhận vào đối số đầu tiên ngầm định nào.

Cú pháp:

class C(object):
    @staticmethod
    def fun(arg1, arg2, ...):
        ...
returns: a static method for function fun.

– Các Static Method cũng là những method (hàm/phương thức) được ràng buộc với class chứ không phải với đối tượng của class.

– Các Static Method không thể truy cập hoặc chỉnh sửa trạng thái của class.

– Decorator @staticmethod hiện diện bên trong một class bởi vì nó giúp cho việc có mặt bên trong class của một method cụ thể nào đó trở nên hợp lý.

3. Class Method và Static Method

– Class Method sẽ nhận vào cls (viết tắt của class, chính là class mà cái Class Method này thuộc về) làm tham số truyền vào đầu tiên, trong khi đó Static Method không cần bất cứ tham số cụ thể nào.

– Class Method có thể truy cập hoặc chỉnh sửa trạng thái của class, trong khid dó, Static Method không thể làm được những điều đó.

– Nói chung, các Static Method sẽ không biết gì về trạng thái của class. Chúng là các utility type methods (tức là những hàm/phương thức thuộc kiểu tiện ích, có chức năng thực hiện tác vụ tiện ích nào đó). Trong khi đó, các class methods phải có được tham số đầu tiên được truyền vào ngầm định là chính class mà chúng thuộc về.

– Chúng ta sử dụng decorator @classmethod trong Python để tạo ra một class method (hàm thuộc về class) và sử dụng decorator @staticmethod để tạo ra một static method (hàm tĩnh) trong Python.

4. Khi nào nên sử dụng Class Method/Static Method?

– Chúng ta thường sử dụng Class Method để tạo ra các Factory Method (hàm chế tạo). Các Factory Methods sẽ trả về class object – đối tượng của class (cách thức hoạt động này thì giống với hàm constructor) cho các trường hợp sử dụng khác nhau.

– Bên cạnh đó, chúng ta sẽ thường sử dụng các Static Method để tạo ra các utility functions – hàm tiện ích.

5. Làm thế nào để định nghĩa Class Method và Static Method

Để định nghĩa một Class Method trong Python, chúng ta sẽ sử dụng decorator @classmethod, còn để định nghĩa một Static Method, chúng ta sẽ sử dụng decorator @staticmethod.

Để hiểu rõ hơn sự khác biệt giữa chúng ta sẽ xét một ví dụ. Giả sử chúng ta muốn tạo ra một class Person. Cần biết rằng Python không hỗ trợ nạp chồng phương thức như C++ hay Java, vì vậy chúng ta sẽ sử dụng các Class Methods để tạo ra các Factory Methods.

Như đã giải thích ở trên, chúng ta sử dụng các phương thức tĩnh để tạo các hàm tiện ích. Trong ví dụ dưới đây, chúng ta sử dụng phương pháp tĩnh(Static) để kiểm tra xem một người đã trưởng thành hay chưa.

# -----------------------------------------------------------
#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ả

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!