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 @classmethod
trang 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 printAge
nhận một tham số cls và không phải self
chúng ta thường lấy.
cls chấp nhận lớp Person
như 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.printAge
như 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 printAge
mà 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 fromBirthYear
phươ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, fromBirthYear
lấ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 fromBirthYear
thà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
.
fromFathersAge
phươ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ì fromBirthYear
có 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ó.