Đối với những người mới bắt đầu học lập trình hướng đối tượng trong Python, điều rất cần thiết là phải nắm vững phương thức lớp và phương thức tĩnh để viết mã được tối ưu hóa hơn và có thể tái sử dụng
Ngoài ra, điều rất phổ biến là ngay cả những lập trình viên có kinh nghiệm đến từ các ngôn ngữ khác nhau cũng bị nhầm lẫn giữa hai ngôn ngữ này.
Trong bài viết này, chúng ta sẽ hiểu rõ hơn về phương thức lớp và phương thức tĩnh trong Python
Phương thức tĩnh trong Python
Một
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
6 là một phương thức không biết gì về lớp hoặc thể hiện mà nó được gọi trừ khi được đưa ra một cách rõ ràng. Nó chỉ nhận các đối số đã được thông qua, không có đối số ngầm định đầu tiên và định nghĩa của nó là bất biến thông qua kế thừaNói một cách đơn giản hơn,
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
6 không gì khác hơn là một hàm thông thường được xác định bên trong một lớp không có quyền truy cập vào thể hiện, do đó, nó có thể được gọi mà không cần khởi tạo lớpcú pháp
class ClassName:
@staticmethod
def method_name[arg1, arg2, ...]: ...
Chúng tôi sử dụng trình trang trí
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
6 để xác định một phương thức tĩnh trong Python, ở đây bạn có thể quan sát thấy rằng phương thức tĩnh không lấy self làm đối số cho phương thứcBây giờ hãy xem một ví dụ
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
Như chúng ta đã thảo luận, chúng ta có thể truy cập phương thức tĩnh của một lớp mà không cần tạo đối tượng
Myclass.staticmethod[]
đầu ra
static method called
Mặc dù gọi phương thức từ một thể hiện của lớp cũng có thể
my_obj = Myclass[]
my_obj.staticmethod[]
đầu ra
static method called
Tuyệt vời, nhưng khi nào các phương thức tĩnh hữu ích?
Phương thức tĩnh giúp đạt được sự đóng gói trong lớp Python vì nó không biết trạng thái của thể hiện hiện tại. Ngoài ra, các phương thức tĩnh làm cho mã dễ đọc hơn và có thể tái sử dụng cũng như nhập thuận tiện hơn so với các hàm cấp mô-đun vì mỗi phương thức không phải được nhập đặc biệt
class Person[]:
@staticmethod
def is_adult[age]:
if age > 18:
return True
else:
return False
Trong ví dụ trên, chúng ta có thể kiểm tra xem người đó có phải là người lớn hay không bắt đầu lớp học
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
0đầu ra
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
1Phương thức lớp trong Python
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 là một phương thức nhận lớp làm đối số đầu tiên ngầm định, giống như một phương thức thể hiện nhận thể hiện. Điều này có nghĩa là bạn có thể sử dụng lớp và các thuộc tính của nó bên trong phương thức đó thay vì một thể hiện cụ thểVì vậy, về cơ bản,
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 là một phương thức của một lớp có quyền truy cập vào mọi thuộc tính của lớp mà nó được gọi. Do đó, một phương thức lớp là một phương thức được liên kết với lớp chứ không phải đối tượng của lớpcú pháp
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
4Trình trang trí
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 được sử dụng để tạo phương thức lớp và Myclass.staticmethod[]
2 phải là đối số đầu tiên của mọi phương thức lớpclass Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
0Các hàm
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 cũng có thể gọi được mà không cần khởi tạo lớp, nhưng định nghĩa của nó tuân theo Lớp con, không phải Lớp cha mẹ, thông qua kế thừaclass Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
1đầu ra
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
2Vậy khi nào thì sử dụng các phương thức của lớp?
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 dành cho khi bạn cần có các phương thức không dành riêng cho bất kỳ trường hợp cụ thể nào, nhưng vẫn liên quan đến lớp theo một cách nào đó. Điều thú vị nhất về chúng là chúng có thể bị ghi đè bởi các lớp conVì vậy, nếu bạn muốn truy cập toàn bộ một thuộc tính của một lớp chứ không phải thuộc tính của một thể hiện cụ thể của lớp đó, hãy sử dụng một phương thức lớp
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
3đầu ra
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
4Bây giờ nếu chúng ta kế thừa lớp này thành một lớp con và khai báo biến
Myclass.staticmethod[]
5 ở đó và gọi phương thức lớp từ lớp con, nó sẽ trả về tổng số đối tượng cho lớp conclass Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
5đầu ra
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 được sử dụng trong một siêu lớp để xác định phương thức đó sẽ hoạt động như thế nào khi nó được gọi bởi các lớp con khác nhau. Trong khi đó, class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
6 được sử dụng khi chúng ta muốn trả về cùng một thứ bất kể lớp con mà chúng ta đang gọiNgoài ra, hãy lưu ý rằng việc gọi một
class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
9 liên quan đến việc cấp phát bộ nhớ bổ sung mà việc gọi một hàm class Myclass[]:
@staticmethod
def staticmethod[]:
print['static method called']
6 hoặc thông thường thì không