classmethod[function]1 được coi là không phải Python, vì vậy trong các phiên bản Python mới hơn, bạn có thể sử dụng trình trang trí
classmethod[function]4 để định nghĩa phương thức lớp
Cú pháp là
@classmethod def func[cls, args...]
classmethod[] Tham số
Phương thức
classmethod[function]1 nhận một tham số duy nhất
- chức năng - Hàm cần được chuyển đổi thành một phương thức lớp
classmethod[] Giá trị trả về
Phương thức
classmethod[function]1 trả về một phương thức lớp cho hàm đã cho
một phương pháp lớp là gì?
Một phương thức lớp là một phương thức được liên kết với một lớp chứ không phải đối tượng của nó. Nó không yêu cầu tạo một thể hiện của lớp, giống như staticmethod
Sự khác biệt giữa phương thức tĩnh và phương thức lớp là
- Phương thức tĩnh không biết gì về lớp và chỉ xử lý các tham số
- Phương thức lớp hoạt động với lớp vì tham số của nó luôn là chính lớp đó
Phương thức lớp có thể được gọi bởi cả lớp và đối tượng của nó
Class.classmethod[] Or even Class[].classmethod[]
Nhưng dù thế nào thì phương thức của lớp luôn gắn với một lớp có đối số đầu tiên là chính lớp đó cls
def classMethod[cls, args...]
ví dụ 1. Tạo phương thức lớp bằng classmethod[]
class Person:
age = 25
def printAge[cls]:
print['The age is:', cls.age]
# create printAge class method
Person.printAge = classmethod[Person.printAge]
Person.printAge[]
đầu ra
________số 8Ở đây, chúng ta có một lớp
classmethod[function]7, với biến thành phần age được gán cho 25
Chúng ta cũng có một hàm
classmethod[function]8 nhận một tham số duy nhất cls chứ không phải
classmethod[function]9 mà chúng ta thường lấy
cls chấp nhận lớp
classmethod[function]7 làm tham số thay vì đối tượng/thể hiện của Person
Bây giờ, chúng ta chuyển phương thức
@classmethod def func[cls, args...]1 làm đối số cho hàm
@classmethod def func[cls, args...]2. Điều này chuyển đổi phương thức thành phương thức lớp để nó chấp nhận tham số đầu tiên là lớp [i. e. Người]
Ở dòng cuối cùng, chúng ta gọi
classmethod[function]8 mà không tạo đối tượng Person như cách chúng ta làm đối với các phương thức tĩnh. Điều này in biến lớp tuổi
Khi nào bạn sử dụng phương thức 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 [như hàm tạo] cho các trường hợp sử dụng khác nhau
Tương tự như nạp chồng hàm trong C++. Vì Python không có bất kỳ thứ gì như vậy nên các phương thức lớp và phương thức tĩnh được sử dụng
ví dụ 2. Tạo phương thức xuất xưởng bằng phương thức lớp
classmethod[function]6
đầu ra
classmethod[function]7
Ở đây, chúng ta có hai trình tạo cá thể lớp, một hàm tạo và một phương thức
@classmethod def func[cls, args...]4
Hàm tạo lấy tham số bình thường name và age. Trong khi,
@classmethod def func[cls, args...]4 lấy lớp, tên và năm sinh, tính tuổi hiện tại bằng cách lấy năm hiện tại trừ đi và trả về thể hiện của lớp
Phương thức fromBirthYear lấy lớp Person [không phải đối tượng Person] làm tham số đầu tiên cls và trả về hàm tạo bằng cách gọi
@classmethod def func[cls, args...]6, tương đương với
@classmethod def func[cls, args...]7
Trước phương thức, chúng ta thấy
classmethod[function]4. Đây được gọi là trình trang trí để chuyển đổi
@classmethod def func[cls, args...]4 thành phương thức lớp là
classmethod[function]1
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 cho ví dụ trên 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
ví dụ 3. Làm thế nào phương thức lớp hoạt động cho kế thừa?
@classmethod def func[cls, args...]5
đầu ra
classmethod[function]0
Ở đây, việc 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 ta 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
classmethod[function]7 thành
Class.classmethod[] Or even Class[].classmethod[]2
Phương thức
Class.classmethod[] Or even Class[].classmethod[]3 không trả về đối tượng
Class.classmethod[] Or even Class[].classmethod[]2 mà là đối tượng của lớp cơ sở
classmethod[function]7
Điều này vi phạm mô hình OOP. Sử dụng một phương thức lớp như
@classmethod def func[cls, args...]4 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ó