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)