Python classmethod ()

Metoda classmethod () vrne metodo razreda za dano funkcijo.

Sintaksa classmethod()metode je:

 classmethod (funkcija)

classmethod()se šteje za ne-Pythonic, zato lahko v novejših različicah Pythona @classmethoddekorater uporabite za definicijo classmethod.

Sintaksa je:

 @classmethod def func (cls, args …)

parametri classmethod ()

classmethod() metoda vzame en parameter:

  • funkcija - funkcija, ki jo je treba pretvoriti v metodo razreda

Vrnjena vrednost iz classmethod ()

classmethod() metoda vrne metodo razreda za dano funkcijo.

Kaj je razredna metoda?

Metoda razreda je metoda, ki je vezana na razred in ne na njegov objekt. Ne zahteva ustvarjanja primerka razreda, podobno kot staticmethod.

Razlika med statično metodo in metodo razreda je:

  • Statična metoda o razredu ne ve ničesar in se ukvarja samo s parametri
  • Metoda razreda deluje z razredom, saj je njegov parameter vedno razred sam.

Metodo razreda lahko prikliče tako razred kot njegov objekt.

 Class.classmethod () Ali celo Class (). Classmethod ()

A ne glede na vse, je metoda razreda vedno pripeta na razred s prvim argumentom, saj se razred sam cls.

 def classMethod (cls, args …)

Primer 1: Ustvari metodo razreda z uporabo 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()

Izhod

 Starost je: 25 let 

Tu imamo razred Persons spremenljivo starostjo člana, določeno za 25 let.

Imamo tudi funkcijo, printAgeki zavzame en parameter cls in je selfobičajno ne.

cls sprejema razred Personkot parameter in ne osebni objekt / primerek.

Zdaj funkcijo prenesemo Person.printAgekot argument kot argument classmethod. S tem se metoda pretvori v metodo razreda, tako da sprejme prvi parameter kot razred (tj. Oseba).

V zadnji vrstici pokličemo, printAgene da bi ustvarili objekt Person, kot to počnemo pri statičnih metodah. S tem se natisne spremenljivka razreda.

Kdaj uporabljate razredno metodo?

1. Tovarniške metode

Tovarniške metode so tiste metode, ki vrnejo objekt razreda (na primer konstruktor) za različne primere uporabe.

Podobno je preobremenitvi funkcij v C ++. Ker Python nima ničesar takega, se uporabljajo metode razredov in statične metode.

Primer 2: Ustvari tovarniško metodo z uporabo metode razreda

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

Izhod

 Adamova starost je: 19 Janezova starost je: 31 let 

Tu imamo dva razredna ustvarjalnika primerkov, konstruktor in fromBirthYearmetodo.

Konstruktor vzame normalno ime in starost parametrov. While, fromBirthYearvzame razred, ime in leto rojstva, izračuna trenutno starost tako, da jo odšteje od tekočega leta in vrne primerek razreda.

Metoda fromBirthYear za prvi parameter cls vzame razred Person (ne objekt Person) in s klicem vrne konstruktor cls(name, date.today().year - birthYear), kar je enakovrednoPerson(name, date.today().year - birthYear)

Pred metodo vidimo @classmethod. To se imenuje dekorater za pretvorbo fromBirthYearv metodo razreda kot classmethod().

2. Pravilno ustvarjanje primerka pri dedovanju

Kadar koli razred izpeljete iz izvajanja tovarniške metode kot metode razreda, to zagotovi pravilno izdelavo primerka izpeljanega razreda.

Za zgornji primer lahko ustvarite statično metodo, toda objekt, ki ga ustvari, bo vedno trdo kodiran kot osnovni razred.

Ko pa uporabite metodo razreda, ustvari pravi primerek izpeljanega razreda.

Primer 3: Kako deluje metoda razreda za dedovanje?

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

Izhod

 Pravilno napačno 

Tukaj uporaba statične metode za ustvarjanje primerka razreda želi, da med ustvarjanjem trdno kodiramo vrsto primerka.

To očitno povzroča težave pri dedovanju Persondo Man.

fromFathersAgemetoda ne vrne Manpredmeta, ampak predmet osnovnega razreda Person.

To krši paradigmo OOP. Uporaba metode razreda, ki fromBirthYearlahko zagotovi OOP-nost kode, saj vzame prvi parameter kot razred sam in pokliče svojo tovarniško metodo.

Zanimive Članki...