Lớp học Python ()

Phương thức classmethod () trả về một phương thức lớp cho hàm đã cho.

Cú pháp của classmethod()phương thức là:

 classmethod (hàm)

classmethod()được coi là không phải Pythonic vì vậy trong các phiên bản Python mới hơn, bạn có thể sử dụng trình @classmethodtrang trí để định nghĩa classmethod.

Cú pháp là:

 @classmethod def func (cls, args…)

tham số classmethod ()

classmethod() phương thức nhận một tham số duy nhất:

  • function - Hàm cần được chuyển đổi thành một phương thức lớp

Trả về giá trị từ classmethod ()

classmethod() phương thức trả về một phương thức lớp cho hàm đã cho.

Phương thức lớp là gì?

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 cá thể 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 () Hoặc thậm chí Class (). Classmethod ()

Nhưng dù thế nào đi nữa, phương thức lớp luôn được gắn với một lớp với đối số đầu tiên là chính lớp đó bám vào.

 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

 Tuổi là: 25 

Ở đây, chúng ta có một lớp Person, với độ tuổi biến thành viên được gán là 25.

Chúng ta cũng có một hàm printAgenhận một tham số cls và không phải selfchúng ta thường lấy.

cls chấp nhận lớp Personnhư một tham số chứ không phải là đối tượng / cá thể của Person.

Bây giờ, chúng ta truyền phương thức Person.printAgenhư một đối số cho hàm classmethod. Điều này chuyển đổi phương thức thành một phương thức lớp để nó chấp nhận tham số đầu tiên là một lớp (tức là Người).

Ở dòng cuối cùng, chúng ta gọi printAgemà không tạo đối tượng Person như chúng ta làm đối với các phương thức tĩnh. Điều này in ra tuổi của biến lớp.

Khi nào bạn sử dụng phương pháp lớp?

1. Phương pháp nhà máy

Phương thức nhà máy 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.

Nó tương tự như nạp chồng hàm trong C ++. Vì Python không có bất cứ thứ gì như vậy, 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 gốc bằng phương thức lớp

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()

Đầu ra

 Tuổi của Adam là: 19 Tuổi của John là: 31 

Ở đây, chúng ta có hai trình tạo cá thể lớp, một fromBirthYearphương thức khởi tạo và một phương thức.

Hàm tạo nhận tên và tuổi các tham số bình thường. Trong khi, fromBirthYearlấy lớp, tên và sinh Năm, tính tuổi hiện tại bằng cách trừ nó với năm hiện tại và trả về cá thể lớp.

Phương thức fromBirthYear nhận 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 cls(name, date.today().year - birthYear), tương đương vớiPerson(name, date.today().year - birthYear)

Trước khi phương pháp, chúng ta thấy @classmethod. Đây được gọi là trình trang trí để chuyển đổi fromBirthYearthành một phương thức lớp dưới dạng classmethod().

2. Tạo phiên bản đúng 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 gốc như một phương thức lớp, nó đảm bảo việc tạo phiên bả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 là lớp Cơ sở.

Tuy nhiên, khi bạn sử dụng một phương thức lớp, nó sẽ tạo ra phiên bản chính xác của lớp dẫn xuất.

Ví dụ 3: Phương thức lớp hoạt động như thế nào đối với kế thừa?

 from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def fromFathersAge(name, fatherAge, fatherPersonAgeDiff): return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff) @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) class Man(Person): sex = 'Male' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))

Đầu ra

 Đúng sai 

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

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

fromFathersAgephương thức không trả về một Manđối tượng mà là đối tượng của lớp cơ sở của nó Person.

Điều này vi phạm mô hình OOP. Sử dụng một phương thức lớp vì fromBirthYearcó thể đảm bảo tính OOP của mã vì nó nhận tham số đầu tiên làm chính lớp và gọi phương thức gốc của nó.

thú vị bài viết...