Metode classmethod () atgriež klases metodi dotajai funkcijai.
Metodes sintakse classmethod()
ir:
klases metode (funkcija)
classmethod()
tiek uzskatīts par ne-Pythonic, tāpēc jaunākās Python versijās @classmethod
klasmetodes definēšanai varat izmantot dekoratoru.
Sintakse ir:
@classmethod def func (cls, args…)
classmethod () Parametri
classmethod()
metode prasa vienu parametru:
- funkcija - funkcija, kas jāpārvērš klases metodē
Atgriešanās vērtība no klases metodes ()
classmethod()
method atgriež klases metodi dotajai funkcijai.
Kas ir klases metode?
Klases metode ir metode, kas ir saistīta ar klasi, nevis tās objektu. Tam nav nepieciešama klases instances izveide, līdzīgi kā statiskā metode.
Atšķirība starp statisko metodi un klases metodi ir:
- Statiskā metode neko nezina par klasi un tikai nodarbojas ar parametriem
- Klases metode darbojas ar klasi, jo tās parametrs vienmēr ir pati klase.
Klases metodi var izsaukt gan klase, gan tās objekts.
Class.classmethod () vai pat Class (). Classmethod ()
Bet neatkarīgi no tā, klases metode vienmēr tiek pievienota klasei ar pirmo argumentu, jo klase pati cls.
def classMethod (cls, args…)
1. piemērs: Izveidojiet klases metodi, izmantojot 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()
Rezultāts
Vecums ir: 25
Šeit mums ir klase Person
, kuras loceklim mainīgais vecums ir 25 gadi.
Mums ir arī funkcija, printAge
kas ņem vienu parametru cls, nevis self
mēs parasti ņemam.
cls pieņem klasi Person
kā parametru, nevis personas objektu / instanci.
Tagad mēs nododam metodi Person.printAge
kā argumentu funkcijai classmethod
. Tas pārveido metodi par klases metodi tā, ka tā pieņem pirmo parametru kā klasi (ti, personu).
Pēdējā rindā mēs izsaucam printAge
, neveidojot objektu Persona, piemēram, statiskām metodēm. Tas izdrukā klases mainīgo vecumu.
Kad jūs izmantojat klases metodi?
1. Rūpnīcas metodes
Rūpnīcas metodes ir tās metodes, kas atgriež klases objektu (piemēram, konstruktoru) dažādiem lietošanas gadījumiem.
Tas ir līdzīgs funkciju pārslodzei C ++. Tā kā Python nav nekā tāda, tiek izmantotas klases metodes un statiskās metodes.
2. piemērs: izveidojiet rūpnīcas metodi, izmantojot klases metodi
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()
Rezultāts
Ādama vecums ir: 19 Jāņa vecums ir: 31
Šeit mums ir divi klases instances veidotāji, konstruktors un fromBirthYear
metode.
Konstruktors ņem normālo parametru nosaukumu un vecumu. Kamēr, fromBirthYear
ņem klasi, vārdu un dzimšanas gadu, aprēķina pašreizējo vecumu, atņemot to ar kārtējo gadu, un atgriež klases instanci.
Metode fromBirthYear kā pirmo parametru cls ņem personu klasi (nevis objektu Person) un atgriež konstruktoru, izsaucot cls(name, date.today().year - birthYear)
, kas ir līdzvērtīgsPerson(name, date.today().year - birthYear)
Pirms metodes mēs redzam @classmethod
. To sauc par dekoratoru, lai pārveidotu fromBirthYear
par klases metodi kā classmethod()
.
2. Pareiza instances izveide mantojumā
Ikreiz, kad klasi iegūstat, izmantojot rūpnīcas metodi kā klases metodi, tas nodrošina atvasinātās klases pareizu eksemplāru izveidošanu.
Iepriekšminētajam piemēram varat izveidot statisku metodi, taču objekts, kuru tas rada, vienmēr tiks kodēts kā Bāzes klase.
Bet, lietojot klases metodi, tā izveido pareizo atvasinātās klases gadījumu.
3. piemērs: Kā klases metode darbojas mantojumā?
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))
Rezultāts
Patiesa Nepatiesa
Izmantojot statisko metodi, lai izveidotu klases instanci, mēs vēlamies, lai radīšanas laikā mēs kodētu instances tipu.
Tas acīmredzami rada problēmas, kad mantojumu Person
līdz Man
.
fromFathersAge
metode neatgriež Man
objektu, bet tā bāzes klases Person
objektu.
Tas pārkāpj OOP paradigmu. Izmantojot klases metodi, tas fromBirthYear
var nodrošināt koda OOP trūkumu, jo tas pirmo parametru uzskata par pašu klasi un izsauc tā rūpnīcas metodi.