Metoda klasowa a metoda statyczna w Pythonie
W tym artykule omówimy podstawy różnica między metodą klasową a metodą statyczną w Pythonie i kiedy używać metody klasowej i metody statycznej w Pythonie.
Co to jest metoda klasowa w Pythonie?
Dekorator @classmethod to wbudowany dekorator funkcji będący wyrażeniem ocenianym po zdefiniowaniu funkcji. Wynik tej oceny przesłania definicję funkcji. A metoda klasowa odbiera klasę jako domyślny pierwszy argument, tak jak metoda instancji odbiera instancję
Składnia Metoda klasy Pythona:
class C(object): @classmethod def fun(cls, arg1, arg2, ...): .... fun: function that needs to be converted into a class method returns: a class method for function.
- Metoda klasowa to metoda powiązana z klasą klasa a nie obiekt klasy.
- 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.
Jaka jest metoda statyczna w Pythonie?
Metoda statyczna nie otrzymuje ukrytego pierwszego argumentu. Metoda statyczna to także metoda powiązana z klasą, a nie z obiektem klasy. Ta metoda nie może uzyskać dostępu do stanu klasy ani go modyfikować. Jest obecna w klasie, ponieważ ma sens, aby metoda była obecna w klasie.
Składnia Metoda statyczna Pythona:
class C(object): @staticmethod def fun(arg1, arg2, ...): ... returns: a static method for function fun.
Metoda klasowa a metoda statyczna
Różnica między metodą Class a metodą statyczną jest następująca:
- 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.
- Używamy dekoratora @classmethod w Pythonie do tworzenia metody klasowej i używamy dekoratora @staticmethod do tworzenia metody statycznej w Pythonie.
Kiedy używać klasy lub metody statycznej?
- Zwykle używamy metody klasowej do tworzenia metod fabrycznych. Metody fabryczne zwracają obiekty klas (podobnie jak konstruktor) dla różnych przypadków użycia.
- Zwykle używamy metod statycznych do tworzenia funkcji użytkowych.
Jak zdefiniować metodę klasową i metodę statyczną?
Aby zdefiniować metodę klasową w Pythonie, używamy dekoratora @classmethod, a do zdefiniowania metody statycznej używamy dekoratora @staticmethod.
Spójrzmy na przykład, aby zrozumieć różnicę między nimi obydwoma. Powiedzmy, że chcemy stworzyć klasę Osoba. Teraz Python nie obsługuje przeciążania metod, takich jak C++ czy Java, więc używamy metod klasowych do tworzenia metod fabrycznych. W poniższym przykładzie używamy metody klasowej do utworzenia obiektu osoby na podstawie roku urodzenia.
Jak wyjaśniono powyżej, używamy metod statycznych do tworzenia funkcji użytkowych. W poniższym przykładzie używamy metody statycznej, aby sprawdzić, czy dana osoba jest dorosła, czy nie.
Jeden prosty przykład:
metoda klasowa:
Python3
class> MyClass:> > def> __init__(> self> , value):> > self> .value> => value> > def> get_value(> self> ):> > return> self> .value> # Create an instance of MyClass> obj> => MyClass(> 10> )> # Call the get_value method on the instance> print> (obj.get_value())> # Output: 10> |
Wyjście
10
Metoda statyczna: -
Python3
class> MyClass:> > def> __init__(> self> , value):> > self> .value> => value> > @staticmethod> > def> get_max_value(x, y):> > return> max> (x, y)> # Create an instance of MyClass> obj> => MyClass(> 10> )> print> (MyClass.get_max_value(> 20> ,> 30> ))> print> (obj.get_max_value(> 20> ,> 30> ))> |
Wyjście
30 30
Poniżej pełna realizacja
Python3
# Python program to demonstrate> # use of 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 25 True
Przestrzeń pomocnicza: O(1)