Python klases metode ()

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 @classmethodklasmetodes 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, printAgekas ņem vienu parametru cls, nevis selfmēs parasti ņemam.

cls pieņem klasi Personkā parametru, nevis personas objektu / instanci.

Tagad mēs nododam metodi Person.printAgekā 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 fromBirthYearmetode.

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 fromBirthYearpar 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 Personlīdz Man.

fromFathersAgemetode neatgriež Manobjektu, bet tā bāzes klases Personobjektu.

Tas pārkāpj OOP paradigmu. Izmantojot klases metodi, tas fromBirthYearvar nodrošināt koda OOP trūkumu, jo tas pirmo parametru uzskata par pašu klasi un izsauc tā rūpnīcas metodi.

Interesanti raksti...