Hàm staticmethod() trong Python

Hàm staticmethod() được coi là un-Pythonic (ngôn ngữ không chính thống của Python). Trong các phiên bản mới hơn của Python, bạn nên sử dụng decorator @staticmethod để thay thế. 

Cú pháp của @staticmethod là:

@staticmethod
 def func(args, ...)

Cú pháp của hàm staticmethod() trong Python

Hàm staticmethod() được xác định bằng cú pháp sau:

staticmethod(function)

Tham số của hàm staticmethod()

Hàm staticmethod() có một tham số duy nhất:

  • Hàm: Hàm cần được chuyển thành một static method

Giá trị trả về của hàm staticmethod()

Hàm staticmethod() trả về một static method cho một hàm tham số mà bạn đưa vào.

Hàm staticmethod() trong Python được dùng để tạo static method của một đối tượng
Hàm staticmethod() trong Python được dùng để tạo static method của một đối tượng

Static method là gì?

Static method, giống như các class method, là những method được liên kết với một class chứ không phải đối tượng của nó. Static method có ưu điểm là không phụ thuộc vào trạng thái của đối tượng.

Sự khác biệt giữa static method và class method là:

Static method không biết gì về class và chỉ xử lý các tham số. Trong khi đó, class method luôn dựa vào class vì tham số của nó luôn luôn là chính class. 

Cả static method và class method đều có thể được gọi bởi cả class và đối tượng.

Class.staticmethodFunc()
 hoặc thậm chí
 Class().staticmethodFunc()

Ví dụ 1: Tạo một static method bằng cách sử dụng hàm staticmethod()

class Quantrimang:
 
     def themso(x, y):
         return x + y
 
 # tạo static method thêm số
 Quantrimang.themso = staticmethod(Quantrimang.themso)
 
 print('Tổng số là:', Quantrimang.themso(5, 10))

Khi chạy chương trình, kết quả thu được là:

Tổng số là: 15

Khi nào chúng ta nên sử dụng static method?

1. Nhóm hàm tiện ích vào một class

Khả năng ứng dụng của static method khá hạn chế bởi, cũng giống với class method hoặc bất kỳ method nào bên trong class, chúng không thể truy cập vào các thuộc tính của chính lớp đó.

Tuy nhiên, khi bạn cần một hàm tiện ích không truy cập bất kỳ thuộc tính nào của một lớp nhưng lại mang ý nghĩa rằng nó thuộc về lớp đó, chúng ta sẽ sử dụng static method.

Ví dụ 2: Tạo một hàm tiện ích bằng static method

class Dates:
     def __init__(self, date):
         self.date = date
         
     def getDate(self):
         return self.date
 
     @staticmethod
     def toDashDate(date):
         return date.replace("/", "-")
 
 date = Dates("15-12-2016")
 dateFromDB = "15/12/2016"
 dateWithDash = Dates.toDashDate(dateFromDB)
 
 if(date.getDate() == dateWithDash):
     print("Trùng khớp")
 else:
     print("Không trùng khớp")

Chạy chương trình cho kết quả là:

Trùng khớp

Ở đây, chúng ta có class Dates chỉ hoạt động với dự liệu ngày tháng năm sử dụng dấu gạch ngang để biểu thị. Tuy nhiên, trong dữ liệu cũ, tất cả ngày tháng năm đều dùng dấu gạch chéo để biểu thị.

Để chuyển đổi từ ngày tháng năm dùng dấu gạch chéo sang ngày tháng năm dùng dấu gạch ngang, chúng ta tạo một hàm tiện ích toDashDate bên trong Dates.

Nó là một static method bởi nó không cần truy cập bất cứ thuộc tính nào của Dates và chỉ cần tham số nhập vào.

Chúng ta cũng có thể tạo toDashDate bên ngoài class nhưng vì nó chỉ xử lý các dữ liệu liên quan tới ngày tháng nên để nó trong class Dates là lựa chọn logic, giúp code trình bày gọn gàng hơn.

2. Có duy nhất một thực thi

Static method được sử dụng khi chúng ta không muốn một class con trong một class thay đổi/ghi đè lên một thực thi đặc biệt của một method.

Ví dụ 3: Kế thừa hoạt động như thế nào với static method?

class Dates:
     def __init__(self, date):
         self.date = date
         
     def getDate(self):
         return self.date
 
     @staticmethod
     def toDashDate(date):
         return date.replace("/", "-")
 
 class DatesWithSlashes(Dates):
     def getDate(self):
         return Dates.toDashDate(self.date)
 
 date = Dates("15-12-2016")
 dateFromDB = DatesWithSlashes("15/12/2016")
 
 if(date.getDate() == dateFromDB.getDate()):
     print("Trùng khớp")
 else:
     print("Không trùng khớp")

Kết quả

Trùng khớp

Ở đây, chúng ta không muốn class con DatesWithSlashes ghi đè lên static utility method toDashDate bởi vì nó chỉ sử dụng một lần duy nhất, ví dụ thay đổi ngày tháng từ dạng sử dụng gạch chéo sang dạng gạch ngang.

Chúng ta có thể dễ dàng sử dụng static method để có thêm nhiều lợi ích bằng cách ghi đè method getDate() trong class con để nó hoạt động tốt với class DatesWithSlashes.

Thứ Hai, 29/06/2020 17:32
31 👨 269
0 Bình luận
Sắp xếp theo