Mètode de classe vs mètode estàtic a Python

En aquest article, tractarem el bàsic diferència entre el mètode de classe i el mètode estàtic en Python i quan utilitzar el mètode de classe i el mètode estàtic en python.

Què és el mètode de classe a Python?

El decorador @classmethod és un decorador de funcions integrat que és una expressió que s'avalua després de definir la funció. El resultat d'aquesta avaluació ombreja la definició de la funció. A mètode de classe rep la classe com un primer argument implícit, igual que un mètode d'instància rep la instància

Sintaxi Mètode de classe 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. 
  • Un mètode de classe és un mètode que està lligat a classe i no l'objecte de la classe.
  • Tenen accés a l'estat de la classe ja que pren un paràmetre de classe que apunta a la classe i no a la instància de l'objecte.
  • Pot modificar un estat de classe que s'aplicaria a totes les instàncies de la classe. Per exemple, pot modificar una variable de classe que serà aplicable a totes les instàncies.

Què és el mètode estàtic en Python?

Un mètode estàtic no rep un primer argument implícit. Un mètode estàtic també és un mètode que està lligat a la classe i no a l'objecte de la classe. Aquest mètode no pot accedir ni modificar l'estat de la classe. Està present en una classe perquè té sentit que el mètode estigui present a classe.

Sintaxi Python Mètode estàtic:

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

Mètode de classe vs Mètode estàtic

La diferència entre el mètode Class i el mètode estàtic és:

  • Un mètode de classe pren cls com a primer paràmetre mentre que un mètode estàtic no necessita paràmetres específics.
  • Un mètode de classe pot accedir o modificar l'estat de la classe mentre que un mètode estàtic no pot accedir-hi ni modificar-lo.
  • En general, els mètodes estàtics no saben res sobre l'estat de classe. Són mètodes de tipus utilitari que prenen alguns paràmetres i treballen sobre aquests paràmetres. D'altra banda, els mètodes de classe han de tenir classe com a paràmetre.
  • Utilitzem @classmethod decorator a Python per crear un mètode de classe i fem servir @staticmethod decorator per crear un mètode estàtic a Python.

Quan utilitzar la classe o el mètode estàtic?

  • En general, utilitzem el mètode de classe per crear mètodes de fàbrica. Els mètodes de fàbrica retornen objectes de classe (similars a un constructor) per a diferents casos d'ús.
  • En general, utilitzem mètodes estàtics per crear funcions d'utilitat.

Com definir un mètode de classe i un mètode estàtic?

Per definir un mètode de classe en Python, fem servir @classmethod decorator, i per definir un mètode estàtic fem servir @staticmethod decorator.
Vegem un exemple per entendre la diferència entre tots dos. Diguem que volem crear una persona de classe. Ara, Python no admet la sobrecàrrega de mètodes com C++ o Java, de manera que utilitzem mètodes de classe per crear mètodes de fàbrica. A l'exemple següent, utilitzem un mètode de classe per crear un objecte persona des de l'any de naixement.

Com s'ha explicat anteriorment, utilitzem mètodes estàtics per crear funcions d'utilitat. A l'exemple següent fem servir un mètode estàtic per comprovar si una persona és adulta o no.

Un exemple senzill:

mètode de classe:

Python 3




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>

Sortida

10 

Mètode estàtic: -

Python 3




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

Sortida

30 30 

A continuació es mostra la implementació completa

Python 3




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

Sortida:

21 25 True 

Espai auxiliar: O(1)