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