Pythoni klassimeetod ()

Meetod classmethod () tagastab antud funktsiooni klassimeetodi.

Meetodi süntaks classmethod()on:

 klassi meetod (funktsioon)

classmethod()peetakse Pythoni keeleks, nii et uuemates Pythoni versioonides saate @classmethodklassimeetodi määratlemiseks kasutada dekoraatorit.

Süntaks on:

 @classmethod def func (cls, args …)

classmethod () parameetrid

classmethod() meetod võtab ühe parameetri:

  • function - funktsioon, mis tuleb teisendada klassimeetodiks

Tagastusväärtus klassimeetodist ()

classmethod() meetod tagastab antud funktsiooni klassi meetodi.

Mis on klassi meetod?

Klassimeetod on meetod, mis on seotud pigem klassi kui selle objektiga. See ei nõua klassieksemplari loomist, umbes nagu staatiline meetod.

Staatilise meetodi ja klassimeetodi erinevus on järgmine:

  • Staatiline meetod ei tea klassist midagi ja tegeleb lihtsalt parameetritega
  • Klassimeetod töötab klassiga, kuna selle parameeter on alati klass ise.

Klassi meetodit saab kutsuda nii klassi kui ka selle objekti järgi.

 Class.classmethod () või isegi Class (). Classmethod ()

Kuid olenemata sellest, on klassi meetod alati esimese argumendiga klassi lisatud, kuna klass ise cls.

 def classMethod (cls, args …)

Näide 1: klassimeetodi () abil klassimeetodi loomine

 class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()

Väljund

 Vanus on: 25 

Siin on meil klass Person, mille liikme vanuseks määratakse 25.

Meil on ka funktsioon, printAgemis võtab ühe parameetri cls, mitte selfme tavaliselt.

cls aktsepteerib klassi Personparameetrina, mitte isiku objektina / eksemplarina.

Nüüd edastame meetodi Person.printAgeargumendina funktsioonile classmethod. See teisendab meetodi klassimeetodiks, nii et see aktsepteerib esimese parameetri klassina (st isik).

Viimases reas helistame printAgeisiklikku objekti loomata nagu staatiliste meetodite puhul. See prindib klassi muutuva vanuse.

Millal kasutate klassi meetodit?

1. Tehase meetodid

Tehasemeetodid on meetodid, mis tagastavad klassiobjekti (näiteks konstruktori) erinevate kasutusjuhtumite jaoks.

See sarnaneb funktsiooni ülekoormusega C ++. Kuna Pythonis pole midagi sellist, kasutatakse klassimeetodeid ja staatilisi meetodeid.

Näide 2: tehase meetodi loomine klassi meetodi abil

 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()

Väljund

 Aadama vanus on: 19 Johannese vanus: 31 

Siin on meil kaks klassieksemplari loojat, konstruktor ja fromBirthYearmeetod.

Konstruktor võtab tavaliste parameetrite nime ja vanuse. Kuigi, fromBirthYearvõtab klassi, nime ja sünniaasta, arvutab praeguse vanuse lahutades selle jooksva aastaga ja tagastab klassieksemplari.

Meetod fromBirthYear võtab esimese parameetrina cls klassi Person (mitte objekti Person) ja tagastab kutsega konstruktori cls(name, date.today().year - birthYear), mis on samaväärnePerson(name, date.today().year - birthYear)

Enne meetodit näeme @classmethod. Seda nimetatakse dekoraator ümberehitamiseks fromBirthYearklassi meetodit nagu classmethod().

2. Õige eksemplari loomine pärimisel

Alati, kui tuletate klassi tehase meetodi kui klassimeetodi rakendamisest, tagab see tuletatud klassi õige eksemplari loomise.

Ülaltoodud näite jaoks saate luua staatilise meetodi, kuid selle loodud objekt kodeeritakse alati põhiklassina.

Kuid kui kasutate klassimeetodit, loob see tuletatud klassi õige eksemplari.

Näide 3: Kuidas klassimeetod pärandina töötab?

 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))

Väljund

 Õige Vale 

Staatilise meetodi kasutamine klassi eksemplari loomiseks soovib siin, et me loomise ajal kodeeriksime eksemplari tüübi.

See on selgelt põhjustab probleeme, kui pärib Person, et Man.

fromFathersAgemeetod ei tagasta Manobjekti, vaid selle põhiklassi Personobjekti.

See rikub OOP paradigmat. Klassimeetodi kasutamine fromBirthYearvõib tagada koodi OOP-vajaduse, kuna see võtab esimese parameetri klassiks ise ja kutsub selle tehasemeetodi.

Huvitavad Artiklid...