Python klassemetode ()

Metoden classmethod () returnerer en klassemetode for den givne funktion.

Syntaksen for classmethod()metoden er:

 klassemetode (funktion)

classmethod()betragtes som un-Pythonic, så i nyere Python-versioner kan du bruge @classmethoddekoratøren til definition af klassemetode.

Syntaksen er:

 @classmethod def func (cls, args …)

classmethod () Parametre

classmethod() metoden tager en enkelt parameter:

  • funktion - Funktion, der skal konverteres til en klassemetode

Returneringsværdi fra klassemetode ()

classmethod() metode returnerer en klassemetode for den givne funktion.

Hvad er en klassemetode?

En klassemetode er en metode, der er bundet til en klasse snarere end dens objekt. Det kræver ikke oprettelse af en klasseinstans, ligesom statisk metode.

Forskellen mellem en statisk metode og en klassemetode er:

  • Statisk metode ved intet om klassen og behandler bare parametrene
  • Klassemetoden fungerer med klassen, da dens parameter altid er selve klassen.

Klassemetoden kan kaldes både af klassen og dens objekt.

 Class.classmethod () Eller endda Class () classmethod ()

Men uanset hvad, klassemetoden er altid knyttet til en klasse med det første argument, som klassen selv cls.

 def classMethod (cls, args …)

Eksempel 1: Opret klassemetode ved hjælp af 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()

Produktion

 Alderen er: 25 

Her har vi en klasse Personmed et medlemsvariabelt alder tildelt 25.

Vi har også en funktion, printAgeder tager en enkelt parameter cls og ikke selfnormalt tager vi.

cls accepterer klassen Personsom en parameter i stedet for Persons objekt / forekomst.

Nu sender vi metoden Person.printAgesom et argument til funktionen classmethod. Dette konverterer metoden til en klassemetode, så den accepterer den første parameter som en klasse (dvs. person).

I den sidste linje kalder vi printAgeuden at oprette et personobjekt, som vi gør for statiske metoder. Dette udskriver klassens variable alder.

Hvornår bruger du klassemetoden?

1. Fabriksmetoder

Fabriksmetoder er de metoder, der returnerer et klasseobjekt (som konstruktør) til forskellige brugssager.

Det svarer til funktionsoverbelastning i C ++. Da Python ikke har noget som sådan, bruges klassemetoder og statiske metoder.

Eksempel 2: Opret fabriksmetode ved hjælp af klassemetoden

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

Produktion

 Adams alder er: 19 Johns alder er: 31 

Her har vi to klasseforekomster, en konstruktør og en fromBirthYearmetode.

Konstruktøren tager normale parametre navn og alder. Mens, fromBirthYeartager klasse, navn og fødselsår, beregner den aktuelle alder ved at trække den med det aktuelle år og returnerer klasseinstansen.

FromBirthYear-metoden tager personklassen (ikke personobjektet) som den første parameter cls og returnerer konstruktøren ved at kalde cls(name, date.today().year - birthYear), hvilket svarer tilPerson(name, date.today().year - birthYear)

Før metoden ser vi @classmethod. Dette kaldes en dekoratør til konvertering fromBirthYeartil en klassemetode som classmethod().

2. Korrekt oprettelse af forekomst i arv

Hver gang du udleder en klasse fra at implementere en fabriksmetode som en klassemetode, sikrer det korrekt oprettelse af den afledte klasse.

Du kan oprette en statisk metode til ovenstående eksempel, men det objekt, det opretter, vil altid blive hårdkodet som Base-klasse.

Men når du bruger en klassemetode, opretter den den korrekte forekomst af den afledte klasse.

Eksempel 3: Hvordan klassemetoden fungerer for arven?

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

Produktion

 Sandt falsk 

Her bruger en statisk metode til at oprette en klasseinstans, at vi skal hardcode instansstypen under oprettelsen.

Dette medfører klart et problem, når man arver Persontil Man.

fromFathersAgemetoden returnerer ikke et Manobjekt, men dets baseklasses Personobjekt.

Dette krænker OOP-paradigmet. Brug af en klassemetode, som fromBirthYearkan sikre OOP-neden for koden, da den tager den første parameter som klassen selv og kalder sin fabriksmetode.

Interessante artikler...