Khi nào thì bạn nên sử dụng phương thức lớp python?

Một phương thức lớp là một phương thức được chia sẻ giữa tất cả các đối tượng. Để gọi một phương thức của lớp, hãy đặt lớp đó làm đối số đầu tiên

Các phương thức của lớp có thể được gọi từ các thể hiện và từ chính lớp đó. Tất cả đều sử dụng cùng một phương pháp. Phương thức có thể sử dụng các biến và phương thức của lớp

khóa học liên quan. Hoàn thành khóa học & bài tập lập trình Python

Thí dụ

ví dụ phương pháp lớp học

Để biến một phương thức thành một classmethod, hãy thêm @classmethod trước định nghĩa phương thức. Là tham số, phương thức luôn lấy lớp

Ví dụ dưới đây định nghĩa một phương thức lớp. Phương thức lớp sau đó có thể được sử dụng bởi chính lớp đó. Trong ví dụ này, phương thức lớp sử dụng tên thuộc tính lớp

1
2
3
4
5
6
7
8
class Fruit:
name = 'Fruitas'

@classmethod
def printName(cls):
print('The name is:', cls.name)

Fruit.printName()

Bạn có thể sử dụng một phương thức lớp với cả đối tượng và lớp

1
2
3
4
5
6
apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()

Tên tham số hiện thuộc về lớp, nếu bạn thay đổi tên bằng cách sử dụng một đối tượng, nó sẽ bỏ qua điều đó. Nhưng nếu bạn làm điều đó theo lớp thì nó sẽ thay đổi, ví dụ bên dưới

1
2
3
4
5
6
7
8
9
apple.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

Fruit.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

viết thay thế

Thường thì ký hiệu Pythonic được sử dụng, nhưng điều này không bắt buộc.
Bạn cũng có thể sử dụng phương thức phân loại như thế này.

1
2
3
4
5
6
7
8
class Fruit:
name = 'Fruitas'

def printName(cls):
print('The name is:', cls.name)

Fruit.printAge = classmethod(Fruit.printName)
Fruit.printAge()

classmethod vs staticmethod

Giống như một phương thức tĩnh, một phương thức lớp không cần một đối tượng được khởi tạo

Một phương thức lớp khác với một phương thức tĩnh ở chỗ một phương thức tĩnh không biết về chính lớp đó. Trong một phương thức lớp, tham số luôn là chính lớp đó

một phương thức tĩnh không biết gì về lớp hoặc thể hiện. Bạn cũng có thể sử dụng một cuộc gọi chức năng

một phương thức lớp nhận lớp khi phương thức được gọi. Nó biết về các thuộc tính và phương thức của lớp

Trong bài viết này, tôi sẽ chỉ cho bạn biết

apple.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

Fruit.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()
5 và
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
0 là gì, tại sao và khi nào bạn nên sử dụng chúng. Bắt đầu nào

Nếu bạn chưa biết trang trí là gì và nó hoạt động như thế nào, thì trước hết hãy đọc bài viết này

Sự định nghĩa

@staticmethod

apple.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

Fruit.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()
5 là một trình trang trí tích hợp xác định một phương thức tĩnh trong lớp trong Python. Một phương thức tĩnh không nhận lớp, cũng không phải đối tượng, các đối số cho dù nó được gọi bởi một thể hiện của một lớp hay bởi chính lớp đó

Đặc điểm

  • Khai báo một phương thức tĩnh trong lớp
  • Nó không thể có tham số
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    2 hoặc
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    3
  • Phương thức tĩnh không thể truy cập các thuộc tính lớp hoặc thuộc tính thể hiện
  • Phương thức tĩnh có thể được gọi bằng cách sử dụng
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    4 và cũng có thể sử dụng
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    5
  • Nó có thể trả về một đối tượng của lớp

Ví dụ sau khai báo một phương thức tĩnh

class Fruit:
name = 'Fruitas'

@classmethod
def printName(cls):
print('The name is:', cls.name)

Fruit.printName()
3

Ở trên, lớp

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
6 khai báo phương thức
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
7 là một phương thức tĩnh sử dụng trình trang trí
apple.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

Fruit.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()
5. Lưu ý rằng nó không thể có tham số
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
3 hoặc
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
2

Phương thức tĩnh có thể được gọi bằng cách sử dụng

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
4 hoặc
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
5

________số 8

@classmethod

1
2
3
4
5
6
13 là một trình trang trí tích hợp xác định một phương thức lớp trong lớp trong Python. Một phương thức lớp chỉ nhận các đối số lớp. Phương thức lớp có thể được gọi bằng cách sử dụng
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
4 hoặc
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
5

1
2
3
4
5
6
13 là một thay thế của hàm
1
2
3
4
5
6
17. Nên sử dụng trình trang trí
1
2
3
4
5
6
13 thay vì chức năng vì nó chỉ là đường cú pháp

Đặc điểm

  • Khai báo một phương thức lớp
  • Tham số đầu tiên phải là
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    2, có thể được sử dụng để truy cập các thuộc tính của lớp
  • Phương thức lớp chỉ có thể truy cập các thuộc tính lớp chứ không thể truy cập các thuộc tính thể hiện
  • Phương thức lớp có thể được gọi bằng cách sử dụng
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    4 và cũng có thể sử dụng
    >>> norm_product = Supermarket.normalize_product_name("milk  ")
    'Milk'
    >>> obj = Supermarket("Bread", "2022-05-18")
    >>> obj.normalize_product_name("milk ")
    'Milk'
    5
  • Nó có thể trả về một đối tượng của lớp

Ví dụ sau khai báo một phương thức lớp

1
2
3
4
5
6
1

Ở trên, lớp

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
6 chứa thuộc tính lớp
apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()
23 và thuộc tính thể hiện
apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()
24. Phương thức
apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()
25 được trang trí bằng trình trang trí
1
2
3
4
5
6
13 làm cho nó trở thành một phương thức lớp, có thể được gọi bằng cách sử dụng
apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()
27. Lưu ý rằng tham số đầu tiên của bất kỳ phương thức lớp nào phải là
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
2 có thể được sử dụng để truy cập các thuộc tính của lớp. Bạn có thể đặt bất kỳ tên nào cho tham số đầu tiên thay vì
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
2

Phương thức lớp có thể được gọi bằng cách sử dụng

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
4 hoặc
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
5

apple = Fruit()
berry = Fruit()

Fruit.printName()
apple.printName()
berry.printName()
2

Nhưng trong phương thức lớp, bạn không thể sử dụng thuộc tính thể hiện

1
2
3
4
5
6
7
8
9
2

Khi nào bạn nên sử dụng các phương thức tĩnh?

1. Nhóm chức năng tiện ích cho một lớp

Các phương thức tĩnh có trường hợp sử dụng hạn chế bởi vì, giống như các phương thức lớp hoặc bất kỳ phương thức nào khác trong một lớp, chúng không thể truy cập 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 có nghĩa là nó thuộc về lớp, chúng ta sử dụng các hàm tĩnh

Ví dụ: bạn đã thêm chức năng thay đổi định dạng tốt nhất trước ngày

1
2
3
4
5
6
7
8
9
3

Đây là một phương thức tĩnh vì nó không cần truy cập bất kỳ thuộc tính nào của chính

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
6 và chỉ yêu cầu các tham số

2. Có một triển khai duy nhất

1
2
3
4
5
6
7
8
9
5

Khi nào bạn nên sử dụng phương thức lớp?

Bạn có thể sử dụng các phương thức lớp cho bất kỳ phương thức nào không bị ràng buộc với một thể hiện cụ thể nhưng lớp. Trong thực tế, bạn thường sử dụng các phương thức của lớp cho các phương thức tạo một thể hiện của lớp

1. phương pháp xuất xưởng

Các phương thức xuất xưởng là những phương thức trả về một đối tượng lớp cho các trường hợp sử dụng khác nhau. Ví dụ

1
2
3
4
5
6
7
8
9
6

Trong trường hợp này, hàm add_product() chỉ tạo một đối tượng lớp mới (một sản phẩm mới và tốt nhất trước ngày)

2. Tạo phiên bản chính xác trong kế thừa

Bất cứ khi nào bạn dẫn xuất một lớp từ việc triển khai một phương thức xuất xưởng làm phương thức lớp, nó đảm bảo việc tạo thể hiện chính xác của lớp dẫn xuất

Bạn có thể tạo một phương thức tĩnh, nhưng đối tượng mà nó tạo ra sẽ luôn được mã hóa cứng dưới dạng Lớp cơ sở

Tuy nhiên, khi bạn sử dụng một phương thức của lớp, nó sẽ tạo ra thể hiện đúng của lớp dẫn xuất

1
2
3
4
5
6
7
8
9
7

Ở đây, sử dụng một phương thức tĩnh để tạo một thể hiện của lớp, muốn chúng tôi mã hóa cứng loại thể hiện trong quá trình tạo

Điều này rõ ràng gây ra sự cố khi kế thừa

>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
6 thành
1
2
3
4
5
6
7
8
9
24

Phương thức

1
2
3
4
5
6
7
8
9
25 không trả về đối tượng
1
2
3
4
5
6
7
8
9
26, nhưng đối tượng của lớp cơ sở của nó là
1
2
3
4
5
6
7
8
9
27

Điều này vi phạm mô hình OOP. Sử dụng một phương thức lớp như

1
2
3
4
5
6
7
8
9
28 có thể đảm bảo tính OOP của mã vì nó lấy tham số đầu tiên làm chính lớp đó và gọi phương thức xuất xưởng của nó

Sự kết luận

Trong bài viết này, chúng tôi đã phân tích

apple.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()

Fruit.name="Apple"
Fruit.printName()
apple.printName()
berry.printName()
5 và
>>> norm_product = Supermarket.normalize_product_name("milk  ")
'Milk'
>>> obj = Supermarket("Bread", "2022-05-18")
>>> obj.normalize_product_name("milk ")
'Milk'
0 là gì và tìm hiểu cách thức, địa điểm và lý do sử dụng chúng

  • Chúng tôi thường sử dụng @classmethod để tạo các phương thức xuất xưởng. Các phương thức xuất xưởng trả về các đối tượng lớp cho các trường hợp sử dụng khác nhau
  • Chúng tôi thường sử dụng các phương thức tĩnh để tạo và nhóm các hàm tiện ích

Chia sẻ suy nghĩ và ý kiến ​​​​của bạn trong phần bình luận, nhấp vào “Vỗ tay” nếu bài viết hữu ích và thú vị đối với bạn. Click “Theo dõi” để luôn nhận được những bài viết hữu ích

Khi nào chúng ta nên sử dụng Classmethod trong Python?

Trong Python, trình trang trí @classmethod được sử dụng để khai báo một phương thức trong lớp dưới dạng một phương thức lớp có thể được gọi bằng Tên lớp. Tên phương thức() . Phương thức lớp cũng có thể được gọi bằng cách sử dụng một đối tượng của lớp.

Tại sao bạn sẽ sử dụng một phương thức lớp?

Các phương thức của 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ợi ích của phương thức lớp trong Python là gì?

Nó làm rõ hơn rằng phương thức không sử dụng bất kỳ trạng thái nào từ thể hiện , thường được đặt tên là self. Ngoài ra, điều đó có nghĩa là bạn có thể kiểm tra nó trên lớp mà không cần tạo một thể hiện.

Tôi nên sử dụng Classmethod hay Staticmethod?

Để quyết định nên sử dụng @staticmethod hay @classmethod, bạn phải xem bên trong phương thức của mình. Nếu phương thức của bạn truy cập các biến/phương thức khác trong lớp thì hãy sử dụng @classmethod .