Python-Klassenmethode ()

Die classmethod () -Methode gibt eine Klassenmethode für die angegebene Funktion zurück.

Die Syntax der classmethod()Methode lautet:

 Klassenmethode (Funktion)

classmethod()wird als unpythonisch betrachtet. In neueren Python-Versionen können Sie den @classmethodDecorator für die Definition von Klassenmethoden verwenden.

Die Syntax lautet:

 @classmethod def func (cls, args…)

classmethod () Parameter

classmethod() Methode nimmt einen einzelnen Parameter:

  • function - Funktion, die in eine Klassenmethode konvertiert werden muss

Rückgabewert von classmethod ()

classmethod() Methode gibt eine Klassenmethode für die angegebene Funktion zurück.

Was ist eine Klassenmethode?

Eine Klassenmethode ist eine Methode, die an eine Klasse und nicht an ihr Objekt gebunden ist. Es ist nicht erforderlich, eine Klasseninstanz zu erstellen, ähnlich wie bei staticmethod.

Der Unterschied zwischen einer statischen Methode und einer Klassenmethode ist:

  • Die statische Methode weiß nichts über die Klasse und befasst sich nur mit den Parametern
  • Die Klassenmethode arbeitet mit der Klasse, da ihr Parameter immer die Klasse selbst ist.

Die Klassenmethode kann sowohl von der Klasse als auch von ihrem Objekt aufgerufen werden.

 Class.classmethod () oder sogar Class (). Classmethod ()

Unabhängig davon wird die Klassenmethode immer an eine Klasse mit dem ersten Argument als Klasse selbst angehängt.

 def classMethod (cls, args…)

Beispiel 1: Erstellen Sie eine Klassenmethode mit 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()

Ausgabe

 Das Alter ist: 25 

Hier haben wir eine Klasse Personmit einem variablen Alter von 25 Jahren.

Wir haben auch eine Funktion printAge, die einen einzelnen Parameter cls akzeptiert und selfnormalerweise nicht.

cls akzeptiert die Klasse Personals Parameter und nicht als Objekt / Instanz der Person.

Jetzt übergeben wir die Methode Person.printAgeals Argument an die Funktion classmethod. Dadurch wird die Methode in eine Klassenmethode konvertiert, sodass der erste Parameter als Klasse (dh Person) akzeptiert wird.

In der letzten Zeile rufen wir auf, printAgeohne ein Personenobjekt zu erstellen, wie wir es für statische Methoden tun. Dies gibt das Alter der Klassenvariablen aus.

Wann verwenden Sie die Klassenmethode?

1. Fabrikmethoden

Factory-Methoden sind Methoden, die ein Klassenobjekt (wie den Konstruktor) für verschiedene Anwendungsfälle zurückgeben.

Es ähnelt der Funktionsüberladung in C ++. Da Python nichts als solches hat, werden Klassenmethoden und statische Methoden verwendet.

Beispiel 2: Erstellen Sie eine Factory-Methode mit der Klassenmethode

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

Ausgabe

 Adams Alter ist: 19 Johns Alter ist: 31 

Hier haben wir zwei Klasseninstanzersteller, einen Konstruktor und eine fromBirthYearMethode.

Der Konstruktor verwendet den Namen und das Alter der normalen Parameter. Während, fromBirthYearnimmt Klasse, Name und Geburtsjahr, berechnet das aktuelle Alter durch Subtrahieren mit dem aktuellen Jahr und gibt die Klasseninstanz zurück.

Die fromBirthYear-Methode verwendet die Person-Klasse (nicht das Person-Objekt) als ersten Parameter cls und gibt den Konstruktor durch Aufrufen zurück cls(name, date.today().year - birthYear), was äquivalent zu istPerson(name, date.today().year - birthYear)

Vor der Methode sehen wir @classmethod. Dies wird als Dekorator für die Konvertierung fromBirthYearin eine Klassenmethode als bezeichnet classmethod().

2. Korrigieren Sie die Instanzerstellung bei der Vererbung

Wenn Sie eine Klasse aus der Implementierung einer Factory-Methode als Klassenmethode ableiten, wird die korrekte Instanzerstellung der abgeleiteten Klasse sichergestellt.

Sie können eine statische Methode für das obige Beispiel erstellen, aber das Objekt, das es erstellt, wird immer als Basisklasse fest codiert.

Wenn Sie jedoch eine Klassenmethode verwenden, wird die richtige Instanz der abgeleiteten Klasse erstellt.

Beispiel 3: Wie funktioniert die Klassenmethode für die Vererbung?

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

Ausgabe

 Wahr falsch 

Wenn Sie hier eine statische Methode zum Erstellen einer Klasseninstanz verwenden, müssen Sie den Instanztyp während der Erstellung fest codieren.

Dies verursacht eindeutig ein Problem beim Erben Personvon Man.

fromFathersAgeDie Methode gibt kein ManObjekt zurück, sondern das Objekt der Basisklasse Person.

Dies verstößt gegen das OOP-Paradigma. Die Verwendung einer Klassenmethode fromBirthYearkann die OOP-Ness des Codes sicherstellen, da der erste Parameter als Klasse selbst verwendet und die Factory-Methode aufgerufen wird.

Interessante Beiträge...