Sự khác biệt giữa phương thức lớp và phương thức tĩnh trong python là gì?

Ngoài các phương thức thể hiện - là thành viên lớp phổ biến nhất trong ngữ cảnh lập trình hướng đối tượng - các lớp trong Python cũng có thể có các phương thức tĩnh và lớp. Ngôn ngữ đi kèm với hai bộ trang trí, cụ thể là

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
8 và
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
9 , cho phép chúng tôi xác định các thành viên như vậy trong các lớp. Điều quan trọng là phải hiểu các khái niệm này vì chúng sẽ giúp bạn viết Python hướng đối tượng rõ ràng hơn và có cấu trúc phù hợp và cuối cùng sẽ giúp việc bảo trì dễ dàng hơn nhiều

Trong bài viết này, chúng ta sẽ khám phá chức năng của cả hai, cách tạo chúng và trong trường hợp nào bạn nên sử dụng cái này thay vì cái kia

Hãy dành một chút thời gian để xem qua mã bên dưới vì mã này sẽ được sử dụng làm lớp Python mẫu mà chúng ta sẽ sử dụng để khám phá một số khái niệm

class Employee:    NO_OF_EMPLOYEES = 0

def __init__(self, first_name, last_name, salary):
self.first_name = first_name
self.last_name = last_name
self.salary = salary
self.increment_employees()
def give_raise(self, amount):
self.salary += amount
@classmethod
def employee_from_full_name(cls, full_name, salary):
split_name = full_name.split(' ')
first_name = split_name[0]
last_name = split_name[1]
return cls(first_name, last_name, salary)
@classmethod
def increment_employees(cls):
cls.NO_OF_EMPLOYEES += 1
@staticmethod
def get_employee_legal_obligations_txt():
legal_obligations = """
1. An employee must complete 8 hours per working day
2. ...
"""
return legal_obligations

Phương thức lớp (@classmethod)

Một phương thức lớp chấp nhận chính lớp đó làm đối số ẩn và -tùy chọn- bất kỳ đối số nào khác được chỉ định trong định nghĩa. Điều quan trọng là phải hiểu rằng một phương thức lớp không có quyền truy cập vào các thể hiện của đối tượng (giống như các phương thức thể hiện). Do đó, các phương thức lớp không thể được sử dụng để thay đổi trạng thái của một đối tượng được khởi tạo mà thay vào đó, chúng có khả năng thay đổi trạng thái lớp được chia sẻ giữa tất cả các thể hiện của lớp đó

Các phương thức lớp thường hữu ích khi chúng ta cần truy cập vào chính lớp đó - ví dụ: khi chúng ta muốn tạo một phương thức xuất xưởng, đó là phương thức tạo các thể hiện của lớp. Nói cách khác, các phương thức lớp có thể đóng vai trò là các hàm tạo thay thế

Trong mã ví dụ của chúng tôi, một thể hiện của

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
0 có thể được xây dựng bằng cách cung cấp ba đối số;

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000

Bây giờ, hãy giả sử rằng có khả năng tên của Nhân viên có thể được cung cấp trong một trường duy nhất trong đó họ và tên được phân tách bằng khoảng trắng. Trong trường hợp này, chúng ta có thể sử dụng phương thức lớp có tên là

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
3 chấp nhận tổng cộng ba đối số. Cái đầu tiên, chính là lớp, là một đối số ngầm có nghĩa là nó sẽ không được cung cấp khi gọi phương thức - Python sẽ tự động làm điều này cho chúng ta

employee_2 = Employee.employee_from_full_name('John Black', 95000)
print(employee_2.first_name)
print(employee_2.salary)
'John'
95000

Lưu ý rằng cũng có thể gọi

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
3 từ các thể hiện đối tượng mặc dù trong ngữ cảnh này, điều đó không có nhiều ý nghĩa

________số 8

Một lý do khác tại sao chúng ta có thể muốn tạo một phương thức lớp, là khi chúng ta cần thay đổi trạng thái của lớp. Trong ví dụ của chúng ta, biến lớp

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
5 theo dõi số lượng nhân viên hiện đang làm việc cho công ty. Phương thức này được gọi mỗi khi một phiên bản mới của
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
0 được tạo và nó cập nhật số đếm tương ứng

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
0

Phương thức tĩnh (@staticmethod)

Mặt khác, trong các phương thức tĩnh, cả trường hợp (i. e.

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
7 ) cũng như bản thân lớp học (i. e.
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
8 ) được thông qua dưới dạng đối số ngầm định. Điều này có nghĩa là các phương thức như vậy, không có khả năng truy cập vào chính lớp đó hoặc các thể hiện của nó

Bây giờ người ta có thể lập luận rằng các phương thức tĩnh không hữu ích trong ngữ cảnh của các lớp vì chúng cũng có thể được đặt trong các mô-đun trợ giúp thay vì thêm chúng làm thành viên của lớp. Trong lập trình hướng đối tượng, điều quan trọng là cấu trúc các lớp của bạn thành các khối hợp lý và do đó, các phương thức tĩnh khá hữu ích khi chúng ta cần thêm một phương thức bên dưới một lớp đơn giản vì nó thuộc về lớp đó.

Trong ví dụ của chúng tôi, phương thức tĩnh có tên

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
9 chỉ trả về một chuỗi chứa các nghĩa vụ pháp lý của từng nhân viên trong công ty. Chức năng này, không tương tác với chính lớp cũng như với bất kỳ trường hợp nào. Nó có thể đã được đặt vào một mô-đun trợ giúp khác, tuy nhiên, nó chỉ liên quan đến lớp này và do đó chúng ta phải đặt nó dưới lớp
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
0

Một phương thức tĩnh có thể được truy cập trực tiếp từ lớp

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
4

hoặc từ một thể hiện của lớp

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
5

Sự kết luận

Trong bài viết này, chúng tôi đã đề cập đến cách hoạt động của các phương thức tĩnh và lớp trong Python cũng như những lý do chính mà bạn nên sử dụng phương thức này thay vì phương thức kia

Các phương thức lớp có thể được tạo bằng cách sử dụng

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
9decorator và chúng được sử dụng để truy cập chính lớp nhưng đồng thời, chúng không có khả năng truy cập các cá thể riêng lẻ. Chúng chủ yếu hữu ích khi chúng ta cần tạo các hàm tạo thay thế, đó là một phương thức lớp tạo một thể hiện của cùng một lớp (có thể chấp nhận các đối số hơi khác nhau)

Mặt khác, một phương thức tĩnh có thể được xây dựng thông qua trình trang trí

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
8 nhưng nó trái ngược với các phương thức của thể hiện hoặc lớp, nó không nhận bất kỳ đối số ẩn nào (không phải
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
7 hay
employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)
'Andrew'
85000
8) và do đó chúng không thể truy cập lớp hoặc các thể hiện của nó. Chúng thường hữu ích khi chúng ta cần đặt một thành viên vào một lớp chỉ vì nó thuộc về nó một cách logic.

Cả hai loại phương pháp này đều có thể giúp bạn viết mã được cấu trúc theo cách dễ đọc và dễ bảo trì

Sự khác biệt giữa phương thức @classmethod và @static là gì?

Phương thức lớp có thể truy cập và sửa đổi trạng thái lớp. Phương thức tĩnh không thể truy cập hoặc sửa đổi trạng thái lớp. Phương thức lớp lấy lớp làm tham số để biết về trạng thái của lớp đó. Các phương thức tĩnh không biết về trạng thái lớp

Sự khác biệt giữa lớp và tĩnh là gì?

Sự khác biệt giữa lớp tĩnh và lớp không tĩnh là lớp tĩnh không thể được khởi tạo hoặc kế thừa và tất cả các thành viên của lớp đều có bản chất tĩnh< . Để khai báo một lớp là tĩnh, bạn nên đánh dấu nó bằng từ khóa tĩnh trong phần khai báo lớp. . To declare a class as static, you should mark it with the static keyword in the class declaration.

Sự khác biệt giữa lớp và phương thức trong Python là gì?

Lớp là khuôn mẫu để tạo hoặc khởi tạo đối tượng trong chương trình trong khi phương thức là hàm thể hiện hành vi của đối tượng . Vì vậy, đây là sự khác biệt chính giữa lớp và phương thức.

Việc sử dụng lớp và phương thức tĩnh trong Python là gì?

Các phương thức tĩnh trong Python cực kỳ giống với các phương thức cấp lớp của python, điểm khác biệt là một phương thức tĩnh được liên kết với một lớp chứ không phải các đối tượng của lớp đó. This means that a static method can be called without an object for that class.