Metode classmethod () mengembalikan metode kelas untuk fungsi yang diberikan.
Sintaks classmethod()
metode adalah:
classmethod (fungsi)
classmethod()
dianggap tidak Pythonic sehingga dalam versi Python yang lebih baru, Anda dapat menggunakan @classmethod
dekorator untuk definisi metode kelas .
Sintaksnya adalah:
@classmethod def func (cls, args…)
classmethod () Parameter
classmethod()
metode mengambil satu parameter:
- function - Fungsi yang perlu diubah menjadi metode kelas
Kembalikan nilai dari classmethod ()
classmethod()
metode mengembalikan metode kelas untuk fungsi yang diberikan.
Apa itu metode kelas?
Metode kelas adalah metode yang terikat ke kelas, bukan objeknya. Itu tidak memerlukan pembuatan instance kelas, seperti metode statis.
Perbedaan antara metode statis dan metode kelas adalah:
- Metode statis tidak tahu apa-apa tentang kelas dan hanya berurusan dengan parameter
- Metode kelas bekerja dengan kelas karena parameternya selalu kelas itu sendiri.
Metode kelas dapat dipanggil baik oleh kelas maupun objeknya.
Class.classmethod () Atau bahkan Class (). Classmethod ()
Tapi apapun yang terjadi, metode kelas selalu dilampirkan ke kelas dengan argumen pertama sebagai kelas itu sendiri.
def classMethod (cls, args…)
Contoh 1: Membuat metode kelas menggunakan 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()
Keluaran
Umurnya: 25
Di sini, kami memiliki kelas Person
, dengan usia variabel anggota ditetapkan ke 25.
Kami juga memiliki fungsi printAge
yang mengambil satu parameter cls dan self
biasanya tidak kami ambil.
cls menerima kelas Person
sebagai parameter daripada objek / instance Orang.
Sekarang, kami meneruskan metode Person.printAge
sebagai argumen ke fungsi tersebut classmethod
. Ini mengubah metode menjadi metode kelas sehingga menerima parameter pertama sebagai kelas (yaitu Orang).
Pada baris terakhir, kita memanggil printAge
tanpa membuat objek Person seperti yang kita lakukan untuk metode statis. Ini mencetak usia variabel kelas.
Kapan Anda menggunakan metode kelas?
1. Metode pabrik
Metode pabrik adalah metode yang mengembalikan objek kelas (seperti konstruktor) untuk kasus penggunaan yang berbeda.
Ini mirip dengan fungsi overloading di C ++. Karena, Python tidak memiliki hal seperti itu, metode kelas dan metode statis digunakan.
Contoh 2: Buat metode pabrik menggunakan metode kelas
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()
Keluaran
Usia Adam: 19 Usia John: 31
Di sini, kami memiliki dua pembuat instance kelas, konstruktor dan fromBirthYear
metode.
Konstruktor mengambil nama dan usia parameter normal. While, fromBirthYear
take class, name and birthYear, menghitung usia saat ini dengan menguranginya dengan tahun saat ini dan mengembalikan instance kelas.
Metode fromBirthYear mengambil kelas Person (bukan objek Person) sebagai parameter pertama cls dan mengembalikan konstruktor dengan memanggil cls(name, date.today().year - birthYear)
, yang setara denganPerson(name, date.today().year - birthYear)
Sebelum metode, kita lihat @classmethod
. Ini disebut dekorator untuk mengonversi fromBirthYear
ke metode kelas sebagai classmethod()
.
2. Benar pembuatan instance dalam warisan
Setiap kali Anda mendapatkan kelas dari mengimplementasikan metode pabrik sebagai metode kelas, ini memastikan pembuatan instance yang benar dari kelas turunan.
Anda dapat membuat metode statis untuk contoh di atas tetapi objek yang dibuatnya, akan selalu di-hardcode sebagai kelas Base.
Tapi, ketika Anda menggunakan metode kelas, itu membuat instance yang benar dari kelas turunan.
Contoh 3: Bagaimana metode kelas bekerja untuk warisan?
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))
Keluaran
Benar salah
Di sini, menggunakan metode statis untuk membuat instance kelas meminta kita untuk melakukan hardcode jenis instance selama pembuatan.
Ini jelas menyebabkan masalah saat mewarisi Person
ke Man
.
fromFathersAge
metode tidak mengembalikan Man
objek tetapi objek kelas dasarnya Person
.
Ini melanggar paradigma OOP. Menggunakan metode kelas yang fromBirthYear
dapat memastikan OOP-ness kode karena ia mengambil parameter pertama sebagai kelas itu sendiri dan memanggil metode pabriknya.