Metoda klas w Pythonie ()

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ć @classmethoddekoratora 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ę Personze zmienną składową wiek przypisaną do 25.

Mamy również funkcję, printAgektóra przyjmuje pojedynczy parametr cls, a selfktórej zwykle nie przyjmujemy.

cls akceptuje klasę Personjako parametr, a nie obiekt / instancję osoby.

Teraz przekazujemy metodę Person.printAgejako 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 printAgebez 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 fromBirthYearmetodę.

Konstruktor przyjmuje normalne parametry name i age. Podczas, gdy fromBirthYearprzyjmuje 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 fromBirthYearna 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 Personsię Man.

fromFathersAgemetoda nie zwraca Manobiektu, ale obiekt jego klasy bazowej Person.

To narusza paradygmat OOP. Użycie metody klasy fromBirthYearmoże zapewnić OOP-ność kodu, ponieważ przyjmuje pierwszy parametr jako samą klasę i wywołuje swoją metodę fabryczną.

Interesujące artykuły...