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 @classmethod
dekoratø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 Person
med et medlemsvariabelt alder tildelt 25.
Vi har også en funktion, printAge
der tager en enkelt parameter cls og ikke self
normalt tager vi.
cls accepterer klassen Person
som en parameter i stedet for Persons objekt / forekomst.
Nu sender vi metoden Person.printAge
som 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 printAge
uden 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 fromBirthYear
metode.
Konstruktøren tager normale parametre navn og alder. Mens, fromBirthYear
tager 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 fromBirthYear
til 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 Person
til Man
.
fromFathersAge
metoden returnerer ikke et Man
objekt, men dets baseklasses Person
objekt.
Dette krænker OOP-paradigmet. Brug af en klassemetode, som fromBirthYear
kan sikre OOP-neden for koden, da den tager den første parameter som klassen selv og kalder sin fabriksmetode.