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)