Bài trước chúng ta tìm hiểu về biến tĩnh trong Python. Bài viết này CodeTuTam sẽ hướng dẫn bạn tìm hiểu về Class Method và Static Method trong Python. Đồng thời chúng ta cũng sẽ làm rõ hơn khi nào thì dùng class method, khi nào thì dùng static method.
Class Method trong Python là gì?
Decorator là 1 function với tham số đầu vào là 1 function và trả về cũng là 1 function.
Một class method sẽ nhận class dưới dạng tham số ngầm định đầu tiên – việc này giống như các instance method nhận self là tham số đầu tiên của hàm
Cú pháp Class method trong Python
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.
Các đặc điểm của class method
- Một class method là một phương thức gắn liền với class chứ không phải là đối tượng của class. Nó giống với các hàm static trong Java, C#…
- Chúng có quyền truy cập tới trạng thái của class vì tham số đầu vào của nó được trỏ tới class – không phải 1 đối tượng thể hiện (instance)
- Nó có thể chỉnh sửa trạng thái class và sẽ áp dụng trên tất cả các instance của class. Ví dụ nó có thể sửa 1 biến static (class variable), và sửa đổi này áp dụng cho tất cả các instance.
Static method trong Python là gì?
Một hàm tĩnh trong Python sẽ không nhận tham số ngầm định đầu tiên. Một static method cũng là một phương thức được liên kết với class chứ không phải các instance. Nó được gắn trong class vì bản thân hàm này có ý nghĩa đối với các phương thức có mặt trong class đó.
Static method này giống như class method, chỉ khác là không có tham số ngầm định.
Cú pháp hàm tĩnh trong Python
class C(object): @staticmethod def fun(arg1, arg2, ...): ... returns: a static method for function fun.
So sánh Class method và static method
Điểm khác nhau giữa class method và static method là
- Một class method lấy cls là tham số đầu tiên của hàm. cls là chỉ class hiện tại. Trong khi đó static method thì không có tham số chỉ định nào cả.
- Một class method có thể truy cập, chỉnh sửa trạng thái của class trong khi static method thì không thể làm điều này
- Trong thực tế, Một hàm tĩnh không biết thông tin về trạng thái của class. Chúng thường là các hàm dạng tiện ích xử lý tính toán dựa trên các tham số đầu vào.
- Chúng ta sử dụng decorator @classmethod để tạo class method, và @staticmethod để tạo static method trong python.
Khi nào sử dụng Class method, static method
- Chúng ta thường sử dụng class method để tạo các factory method. Factory method tùy thuộc vào từng đầu vào sẽ trả về các object khác nhau.
- Chúng ta sử dụng static method để tạo các hàm hỗ trợ/tiện ích xử lý
Cách định nghĩa một class method và static method
Để hiểu rõ cách hoạt động của class method và static method, chúng ta làm thử ví dụ tạo class Person. Hiện tại thì Python không hỗ trợ cơ chế overloading giống trong C++ hay Java do vậy chúng ta sẽ sử dụng class method để tạo factory method.
Trong ví dụ dưới dây, chúng ta tạo một class method để tạo 1 đối tượng person từ năm sinh.
Như đã giải thích ở trên, chúng tôi sử dụng các static method để tạo các hàm tiện ích. Trong ví dụ dưới đây, chúng ta sử dụng static method để kiểm tra một người có phải là người lớn hay không.
Ví dụ về Static Method
class MyClass: def __init__(self, value): self.value = value @staticmethod def get_max_value(x, y): return max(x, y) # Create an instance of MyClass obj = MyClass(10) print(MyClass.get_max_value(20, 30)) print(obj.get_max_value(20, 30))
Kết quả
30 30
Ví dụ đầy đủ về class method và static method
# 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 25 True