classmethod() w Pythonie

The metoda klasowa() to wbudowana funkcja w Pythonie, która zwraca metodę klasową dla danej funkcji.

classmethod() w składni Pythona

Składnia: metoda klasowa (funkcja)

Parametr: Funkcja ta przyjmuje jako parametr nazwę funkcji.

Typ zwrotu: Ta funkcja zwraca przekonwertowaną metodę klasy.

Funkcja klasy() w Pythonie

Metody classmethod() są powiązane z klasą, a nie z obiektem. Metody klasowe mogą być wywoływane zarówno przez klasę, jak i obiekt. Metody te można wywołać za pomocą klasy lub obiektu.

Metoda klasowa a metoda statyczna

Podstawowa różnica pomiędzy metoda klasowa vs metoda statyczna w Pythonie i kiedy używać metody klasowej i metody statycznej Pyton .

  • Metoda klasowa przyjmuje cls jako pierwszy parametr, podczas gdy metoda statyczna nie wymaga żadnych określonych parametrów.
  • Metoda klasowa może uzyskać dostęp do stanu klasy lub go zmodyfikować, podczas gdy metoda statyczna nie może uzyskać do niego dostępu ani go zmodyfikować.
  • Ogólnie rzecz biorąc, metody statyczne nie wiedzą nic o stanie klasy. Są to metody użytkowe, które pobierają pewne parametry i na nich pracują. Z drugiej strony metody klasowe muszą mieć klasę jako parametr.
  • Dekoratora @classmethod używamy w Pythonie do tworzenia metody klasowej, a dekoratora @staticmethod używamy do tworzenia metody statycznej w Pythonie.

Przykład metody klasowej w Pythonie

Utwórz prostą metodę klasową

W tym przykładzie zobaczymy, jak utworzyć metodę klasową w Pythonie. W tym celu stworzyliśmy klasę o nazwie Geeks ze zmienną składową Course i utworzyliśmy funkcję o nazwie zakup, która wypisuje obiekt. Teraz przekazaliśmy tę metodę Geeks.purchase> do metody klasowej przy użyciu metody @classmethod> dekorator, który konwertuje metodę na metodę klasową. Dzięki metodzie klasowej możemy wywołać funkcję zakupu bez tworzenia obiektu funkcji, bezpośrednio używając nazwy klasy Geeks.

Python3




class> geeks:> > course> => 'DSA'> > def> purchase(obj):> > print> (> 'Purchase course : '> , obj.course)> geeks.purchase> => classmethod> (geeks.purchase)> geeks.purchase()>

Wyjście

Purchase course : DSA 

Utwórz metodę klasową za pomocą metody classmethod()

Utworzono metodę klasy print_name przed utworzeniem tej linii print_name() Można ją wywołać tylko z obiektem nienależącym do klasy, teraz tę metodę można wywołać, ponieważ metoda klasowa metoda print_name() nazywa się metodą klasową.

Python3




class> Student:> > # create a variable> > name> => 'Geeksforgeeks'> > # create a function> > def> print_name(obj):> > print> (> 'The name is : '> , obj.name)> # create print_name classmethod> # before creating this line print_name()> # It can be called only with object not with class> Student.print_name> => classmethod> (Student.print_name)> # now this method can be called as classmethod> # print_name() method is called a class method> Student.print_name()>

Wyjście

The name is : Geeksforgeeks 

Metoda fabryczna wykorzystująca metodę klasy

Zastosowania funkcji classmethod() są stosowane we wzorcach projektowania fabryk, gdzie chcemy wywołać wiele funkcji za pomocą nazwy klasy, a nie obiektu.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime> import> date> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > # a class method to create a> > # Person object by birth year.> > @classmethod> > def> fromBirthYear(> cls> , name, year):> > return> cls> (name, date.today().year> -> year)> > def> display(> self> ):> > print> (> 'Name : '> ,> self> .name,> 'Age : '> ,> self> .age)> person> => Person(> 'mayank'> ,> 21> )> person.display()>

Wyjście

Name : mayank Age : 21 

Jak metoda klasowa działa w przypadku dziedziczenia?

W tym przykładzie tworzymy hierarchię klas Pythona z dwiema klasami, Person> I Man> i demonstruje użycie metod klasowych i dziedziczenia.

Python3




from> datetime> import> date> # random Person> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > @staticmethod> > def> from_FathersAge(name, fatherAge, fatherPersonAgeDiff):> > return> Person(name, date.today().year> -> fatherAge> +> fatherPersonAgeDiff)> > @classmethod> > def> from_BirthYear(> 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> => 'Female'> man> => Man.from_BirthYear(> 'John'> ,> 1985> )> print> (> isinstance> (man, Man))> man1> => Man.from_FathersAge(> 'John'> ,> 1965> ,> 20> )> print> (> isinstance> (man1, Man))>

Wyjście

True False 

Dekorator Pythona @classmethod

Dekorator @classmethod jest wbudowany dekorator funkcji które jest wyrażeniem ocenianym po zdefiniowaniu funkcji. Wynik tej oceny przesłania definicję funkcji. Metoda klasowa otrzymuje klasę jako domyślny pierwszy argument, tak jak metoda instancji otrzymuje instancję.

Składnia Dekoratora metody klasowej

klasa C(obiekt):

@metodaklasowa

def zabawa(cls, arg1, arg2, …):

….

Gdzie,

  • zabawa: funkcja, którą należy przekonwertować na metodę klasową
  • zwroty: metoda klasowa funkcji.

Notatka:

  • Metoda klasowa to metoda powiązana z klasą, a nie z jej obiektem.
  • Mają dostęp do stanu klasy, ponieważ pobiera parametr klasy wskazujący na klasę, a nie na instancję obiektu.
  • Może modyfikować stan klasy, który miałby zastosowanie we wszystkich instancjach klasy. Na przykład może zmodyfikować zmienną klasy, która będzie miała zastosowanie do wszystkich instancji.

Przykład

W poniższym przykładzie używamy metod staticmethod() i classmethod(), aby sprawdzić, czy dana osoba jest dorosła, czy nie.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime> import> date> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > # a class method to create a> > # Person object by birth year.> > @classmethod> > def> fromBirthYear(> cls> , name, year):> > return> cls> (name, date.today().year> -> year)> > # a static method to check if a> > # Person is adult or not.> > @staticmethod> > def> isAdult(age):> > return> age>> 18> person1> => Person(> 'mayank'> ,> 21> )> person2> => Person.fromBirthYear(> 'mayank'> ,> 1996> )> print> (person1.age)> print> (person2.age)> # print the result> print> (Person.isAdult(> 22> ))>

Wyjście

21 27 True