Metoda třídy vs statická metoda v Pythonu

V tomto článku se budeme zabývat základními rozdíl mezi metodou třídy a statickou metodou v Pythonu a kdy použít metodu třídy a statickou metodu v pythonu.

Co je metoda třídy v Pythonu?

Dekorátor @classmethod je vestavěný dekorátor funkcí, což je výraz, který se vyhodnotí po definování vaší funkce. Výsledek tohoto vyhodnocení zastíní vaši definici funkce. A třídní metoda přijímá třídu jako implicitní první argument, stejně jako metoda instance přijímá instanci

Syntaxe metody třídy Python:

 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 třídy je metoda, která je vázána na třída a ne předmět třídy.
  • Mají přístup ke stavu třídy, protože vyžaduje parametr třídy, který ukazuje na třídu a ne na instanci objektu.
  • Může upravit stav třídy, který by se vztahoval na všechny instance třídy. Může například upravit proměnnou třídy, která bude použitelná pro všechny instance.

Co je statická metoda v Pythonu?

Statická metoda neobdrží implicitní první argument. Statická metoda je také metoda, která je vázána na třídu a ne na objekt třídy. Tato metoda nemůže přistupovat ke stavu třídy ani jej upravovat. Je přítomen ve třídě, protože dává smysl, aby byla metoda přítomna ve třídě.

Syntaxe Python Statická metoda:

 class C(object):  @staticmethod  def fun(arg1, arg2, ...):  ... returns: a static method for function fun. 

Metoda tříd vs statická metoda

Rozdíl mezi metodou Class a statickou metodou je:

  • Metoda třídy bere cls jako první parametr, zatímco statická metoda nepotřebuje žádné specifické parametry.
  • Metoda třídy může přistupovat ke stavu třídy nebo jej upravovat, zatímco statická metoda k němu nemůže přistupovat ani jej upravovat.
  • Obecně platí, že statické metody nevědí nic o stavu třídy. Jsou to metody obslužného typu, které přebírají některé parametry a pracují na těchto parametrech. Na druhou stranu metody třídy musí mít jako parametr třídu.
  • K vytvoření metody třídy používáme @classmethod decorator v pythonu a k vytvoření statické metody v pythonu používáme @staticmethod decorator.

Kdy použít třídu nebo statickou metodu?

  • K vytvoření továrních metod obecně používáme metodu třídy. Tovární metody vracejí objekty třídy (podobně jako konstruktor) pro různé případy použití.
  • K vytváření užitkových funkcí obecně používáme statické metody.

Jak definovat metodu třídy a statickou metodu?

K definování metody třídy v pythonu používáme @classmethod decorator a k definování statické metody používáme @staticmethod decorator.
Podívejme se na příklad, abychom pochopili rozdíl mezi oběma. Řekněme, že chceme vytvořit třídu Osoba. Nyní python nepodporuje přetěžování metod jako C++ nebo Java, takže k vytváření továrních metod používáme metody tříd. V níže uvedeném příkladu používáme metodu třídy k vytvoření objektu osoby od roku narození.

Jak bylo vysvětleno výše, k vytváření užitkových funkcí používáme statické metody. V níže uvedeném příkladu používáme statickou metodu ke kontrole, zda je osoba dospělá nebo ne.

Jeden jednoduchý příklad:

metoda třídy:

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>

Výstup

10 

Statická metoda: -

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> ))>

Výstup

30 30 

Níže je kompletní Implementace

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> ))>

Výstup:

21 25 True 

Pomocný prostor: O(1)