Metoda classmethod () zwraca metodę klasy dla danej funkcji.
Składnia classmethod()
metody to:
classmethod (funkcja)
classmethod()
jest uważany za nie-Pythona, więc w nowszych wersjach Pythona można użyć @classmethod
dekoratora do definicji metody klas.
Składnia jest następująca:
@classmethod def func (cls, args…)
classmethod () Parametry
classmethod()
metoda przyjmuje jeden parametr:
- funkcja - funkcja, która musi zostać przekonwertowana na metodę klasy
Wartość zwracana z metody classmethod ()
classmethod()
metoda zwraca metodę klasy dla danej funkcji.
Co to jest metoda klasowa?
Metoda klasowa to metoda, która jest powiązana z klasą, a nie z jej obiektem. Nie wymaga tworzenia instancji klasy, podobnie jak staticmethod.
Różnica między metodą statyczną a klasową jest następująca:
- Metoda statyczna nic nie wie o klasie i zajmuje się tylko parametrami
- Metoda class działa z klasą, ponieważ jej parametrem jest zawsze sama klasa.
Metoda klasy może być wywoływana zarówno przez klasę, jak i przez jej obiekt.
Class.classmethod () Lub nawet Class (). Classmethod ()
Ale bez względu na wszystko, metoda class jest zawsze dołączona do klasy z pierwszym argumentem jako klasą cls.
def classMethod (cls, args…)
Przykład 1: Utwórz metodę klasy za pomocą 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()
Wynik
Wiek: 25 lat
Tutaj mamy klasę Person
ze zmienną składową wiek przypisaną do 25.
Mamy również funkcję, printAge
która przyjmuje pojedynczy parametr cls, a self
której zwykle nie przyjmujemy.
cls akceptuje klasę Person
jako parametr, a nie obiekt / instancję osoby.
Teraz przekazujemy metodę Person.printAge
jako argument do funkcji classmethod
. Spowoduje to przekształcenie metody w metodę klasową, tak aby akceptowała pierwszy parametr jako klasę (tj. Person).
W ostatnim wierszu wywołujemy printAge
bez tworzenia obiektu Person, tak jak robimy to w przypadku metod statycznych. To wypisuje zmienną wiek klasy.
Kiedy używasz metody klasowej?
1. Metody fabryczne
Metody fabryczne to te metody, które zwracają obiekt klasy (np. Konstruktor) dla różnych przypadków użycia.
Jest to podobne do przeciążania funkcji w C ++. Ponieważ Python nie ma niczego takiego, używane są metody klasowe i metody statyczne.
Przykład 2: Tworzenie metody fabrycznej przy użyciu metody klasy
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()
Wynik
Wiek Adama to: 19 lat Wiek Jana: 31 lat
Tutaj mamy kreator dwóch klas, konstruktor i fromBirthYear
metodę.
Konstruktor przyjmuje normalne parametry name i age. Podczas, gdy fromBirthYear
przyjmuje klasę, imię i rok urodzenia, oblicza bieżący wiek, odejmując go od bieżącego roku i zwraca instancję klasy.
Metoda fromBirthYear przyjmuje klasę Person (nie obiekt Person) jako pierwszy parametr cls i zwraca konstruktor przez wywołanie cls(name, date.today().year - birthYear)
, co jest równoważne zPerson(name, date.today().year - birthYear)
Przed metodą widzimy @classmethod
. Nazywa się to dekoratorem do konwersji fromBirthYear
na metodę klasy as classmethod()
.
2. Prawidłowe tworzenie instancji w dziedziczeniu
Ilekroć wyprowadzasz klasę z implementacji metody fabrycznej jako metody klasy, zapewnia to prawidłowe utworzenie instancji klasy pochodnej.
Możesz utworzyć statyczną metodę dla powyższego przykładu, ale tworzony przez nią obiekt będzie zawsze zakodowany na stałe jako klasa podstawowa.
Ale kiedy używasz metody klasy, tworzy ona poprawne wystąpienie klasy pochodnej.
Przykład 3: Jak działa metoda klasy w przypadku dziedziczenia?
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))
Wynik
Prawda fałsz
W tym przypadku użycie metody statycznej do utworzenia instancji klasy wymaga od nas zakodowania typu instancji podczas tworzenia.
To wyraźnie powoduje problem, gdy dziedziczy Person
się Man
.
fromFathersAge
metoda nie zwraca Man
obiektu, ale obiekt jego klasy bazowej Person
.
To narusza paradygmat OOP. Użycie metody klasy fromBirthYear
może zapewnić OOP-ność kodu, ponieważ przyjmuje pierwszy parametr jako samą klasę i wywołuje swoją metodę fabryczną.