Python klassmetod ()

Metoden classmethod () returnerar en klassmetod för den givna funktionen.

Syntaxen för classmethod()metoden är:

 klassmetod (funktion)

classmethod()anses vara Pythonic så i nyare Python-versioner kan du använda @classmethoddekoratören för definition av klassmetod.

Syntaksen är:

 @classmethod def func (cls, args …)

classmethod () Parametrar

classmethod() metoden tar en enda parameter:

  • function - Funktion som behöver konverteras till en klassmetod

Returvärde från klassmetod ()

classmethod() metoden returnerar en klassmetod för den givna funktionen.

Vad är en klassmetod?

En klassmetod är en metod som är bunden till en klass snarare än dess objekt. Det kräver inte skapande av en klassinstans, ungefär som statisk metod.

Skillnaden mellan en statisk metod och en klassmetod är:

  • Statisk metod vet ingenting om klassen och hanterar bara parametrarna
  • Klassmetoden fungerar med klassen eftersom dess parameter alltid är själva klassen.

Klassmetoden kan kallas både av klassen och dess objekt.

 Class.classmethod () Eller till och med Class (). Classmethod ()

Men oavsett vad, klassmetoden är alltid kopplad till en klass med det första argumentet som klassen själv cls.

 def classMethod (cls, args …)

Exempel 1: Skapa klassmetod med 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

 Åldern är: 25 

Här har vi en klass Personmed en åldersgräns på 25 år.

Vi har också en funktion printAgesom tar en enda parameter cls och inte tar selfvi vanligtvis.

cls accepterar klassen Personsom en parameter i stället för Persons objekt / instans.

Nu skickar vi metoden Person.printAgesom ett argument till funktionen classmethod. Detta omvandlar metoden till en klassmetod så att den accepterar den första parametern som en klass (dvs. Person).

I sista raden ringer vi printAgeutan att skapa ett personobjekt som vi gör för statiska metoder. Detta skriver ut klassens variabla ålder.

När använder du klassmetoden?

1. Fabriksmetoder

Fabriksmetoder är de metoder som returnerar ett klassobjekt (som konstruktör) för olika användningsfall.

Det liknar funktionsöverbelastning i C ++. Eftersom Python inte har något som sådant används klassmetoder och statiska metoder.

Exempel 2: Skapa fabriksmetod med klassmetod

 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 ålder är: 19 Johns ålder är: 31 

Här har vi två klassinstansskapare, en konstruktör och en fromBirthYearmetod.

Konstruktören tar normala parametrar namn och ålder. While, fromBirthYeartar klass, namn och födelseår, beräknar den aktuella åldern genom att dra den från det aktuella året och returnerar klassinstansen.

FromBirthYear-metoden tar personklassen (inte personobjektet) som den första parametern cls och returnerar konstruktorn genom att anropa cls(name, date.today().year - birthYear), vilket motsvararPerson(name, date.today().year - birthYear)

Innan metoden ser vi @classmethod. Detta kallas en dekoratör för att konvertera fromBirthYeartill en klassmetod som classmethod().

2. Rätt skapande av förekomst i arv

Varje gång du får en klass från att implementera en fabriksmetod som en klassmetod, säkerställer det korrekt instansskapande av den härledda klassen.

Du kan skapa en statisk metod för exemplet ovan men objektet det skapar kommer alltid att vara hårdkodade som basklass.

Men när du använder en klassmetod skapar den rätt förekomst av den härledda klassen.

Exempel 3: Hur klassmetoden fungerar för arvet?

 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

 Sant falskt 

Här vill vi använda en statisk metod för att skapa en klassinstans att vi hårdkodar förekomsttypen under skapandet.

Detta orsakar helt klart ett problem när man ärver Persontill Man.

fromFathersAgemetoden returnerar inte ett Manobjekt utan dess basklass Personobjekt.

Detta bryter mot OOP-paradigmet. Med hjälp av en klassmetod som fromBirthYearkan säkerställa OOP-ness för koden eftersom den tar den första parametern som klassen själv och kallar sin fabriksmetod.

Intressanta artiklar...