Kaedah classmethod () mengembalikan kaedah kelas untuk fungsi yang diberikan.
Sintaks classmethod()
kaedah adalah:
kaedah kelas (fungsi)
classmethod()
dianggap tidak Pythonic jadi dalam versi Python yang lebih baru, anda boleh menggunakan @classmethod
penghias untuk definisi kaedah kelas.
Sintaksnya adalah:
@classmethod def func (kl, args…)
kaedah kelas () Parameter
classmethod()
kaedah mengambil satu parameter:
- fungsi - Fungsi yang perlu ditukar menjadi kaedah kelas
Nilai pulangan dari kaedah kelas ()
classmethod()
kaedah mengembalikan kaedah kelas untuk fungsi yang diberikan.
Apakah kaedah kelas?
Kaedah kelas adalah kaedah yang terikat pada kelas dan bukannya objeknya. Ia tidak memerlukan pembuatan contoh kelas, seperti kaedah statik.
Perbezaan antara kaedah statik dan kaedah kelas adalah:
- Kaedah statik tidak mengetahui apa-apa mengenai kelas dan hanya membincangkan parameternya
- Kaedah kelas berfungsi dengan kelas kerana parameternya selalu kelas itu sendiri.
Kaedah kelas boleh dipanggil oleh kelas dan objeknya.
Class.classmethod () Atau bahkan Class (). Classmethod ()
Tetapi tidak kira apa, kaedah kelas selalu dilampirkan pada kelas dengan hujah pertama kerana kelas itu sendiri.
def classMethod (cls, args…)
Contoh 1: Buat kaedah kelas menggunakan kaedah kelas ()
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Pengeluaran
Umurnya: 25
Di sini, kita mempunyai kelas Person
, dengan umur berubah-ubah anggota yang ditetapkan kepada 25.
Kami juga mempunyai fungsi printAge
yang mengambil satu parameter cls dan tidak self
biasanya kami ambil.
cls menerima kelas Person
sebagai parameter dan bukannya objek / contoh Orang.
Sekarang, kita lulus kaedah Person.printAge
sebagai argumen untuk fungsi classmethod
. Ini mengubah kaedah menjadi kaedah kelas sehingga ia menerima parameter pertama sebagai kelas (iaitu Orang).
Pada baris terakhir, kita memanggil printAge
tanpa membuat objek Person seperti yang kita lakukan untuk kaedah statik. Ini mencetak umur berubah kelas.
Bilakah anda menggunakan kaedah kelas?
1. Kaedah kilang
Kaedah kilang adalah kaedah yang mengembalikan objek kelas (seperti konstruktor) untuk kes penggunaan yang berbeza.
Ia serupa dengan fungsi berlebihan di C ++. Oleh kerana, Python tidak mempunyai apa-apa, kaedah kelas dan kaedah statik digunakan.
Contoh 2: Buat kaedah kilang menggunakan kaedah 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()
Pengeluaran
Umur Adam ialah: 19 Umur John adalah: 31
Di sini, kita mempunyai dua pencipta contoh kelas, konstruktor dan fromBirthYear
kaedah.
Pembina mengambil parameter dan nama normal umur. Sementara, fromBirthYear
mengambil kelas, nama dan kelahiranTahun, mengira usia semasa dengan mengurangkannya dengan tahun semasa dan mengembalikan contoh kelas.
Kaedah fromBirthYear mengambil kelas Person (bukan objek Person) sebagai parameter pertama cl dan mengembalikan konstruktor dengan memanggil cls(name, date.today().year - birthYear)
, yang setara denganPerson(name, date.today().year - birthYear)
Sebelum kaedahnya, kita lihat @classmethod
. Ini dipanggil penghias untuk menukar fromBirthYear
ke kaedah kelas sebagai classmethod()
.
2. Pembentukan contoh yang betul dalam pewarisan
Setiap kali anda memperoleh kelas dari melaksanakan kaedah kilang sebagai kaedah kelas, ia memastikan pembuatan contoh yang betul dari kelas turunan.
Anda boleh membuat kaedah statik untuk contoh di atas tetapi objek yang dihasilkannya, akan selalu dikodkan sebagai kelas Asas.
Tetapi, apabila anda menggunakan kaedah kelas, ia akan menghasilkan contoh kelas turunan yang betul.
Contoh 3: Bagaimana kaedah kelas berfungsi untuk pewarisan?
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))
Pengeluaran
Betul salah
Di sini, menggunakan kaedah statik untuk membuat instance kelas ingin kita membuat kod keras jenis instance semasa membuat.
Ini jelas menyebabkan masalah apabila mewarisi Person
untuk Man
.
fromFathersAge
kaedah tidak mengembalikan Man
objek tetapi objek kelas asasnya Person
.
Ini melanggar paradigma OOP. Menggunakan kaedah kelas seperti yang fromBirthYear
dapat memastikan OOP-ness kod kerana mengambil parameter pertama sebagai kelas itu sendiri dan memanggil kaedah kilang.