Método de clase vs método estático en Python

En este artículo, cubriremos la diferencia básica entre el método de clase y el método estático en Python y cuándo usar el método de clase y el método estático en Python.

¿Qué es el método de clase en Python? 

El decorador @classmethod es un decorador de funciones incorporado que es una expresión que se evalúa después de definir su función. El resultado de esa evaluación ensombrece la definición de su función. Un método de clase recibe la clase como un primer argumento implícito, al igual que un método de instancia recibe la instancia 

Sintaxis Método de clase de 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étodo de clase es un método que está vinculado a la clase y no al objeto de la clase.
  • Tienen acceso al estado de la clase ya que toma un parámetro de clase que apunta a la clase y no a la instancia del objeto.
  • Puede modificar un estado de clase que se aplicaría en todas las instancias de la clase. Por ejemplo, puede modificar una variable de clase que será aplicable a todas las instancias.

¿Qué es el método estático en Python?

Un método estático no recibe un primer argumento implícito. Un método estático también es un método que está vinculado a la clase y no al objeto de la clase. Este método no puede acceder ni modificar el estado de la clase. Está presente en una clase porque tiene sentido que el método esté presente en la clase.

Método estático de sintaxis de Python: 

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

Método de clase vs método estático

La diferencia entre el método Class y el método estático es:

  • Un método de clase toma cls como primer parámetro, mientras que un método estático no necesita parámetros específicos.
  • Un método de clase puede acceder o modificar el estado de la clase, mientras que un método estático no puede acceder ni modificarlo.
  • En general, los métodos estáticos no saben nada sobre el estado de la clase. Son métodos de tipo de utilidad que toman algunos parámetros y funcionan sobre esos parámetros. Por otro lado, los métodos de clase deben tener la clase como parámetro.
  • Usamos el decorador @classmethod en python para crear un método de clase y usamos el decorador @staticmethod para crear un método estático en python.

¿Cuándo usar la clase o el método estático?

  • Generalmente usamos el método de clase para crear métodos de fábrica. Los métodos de fábrica devuelven objetos de clase (similares a un constructor) para diferentes casos de uso.
  • Generalmente usamos métodos estáticos para crear funciones de utilidad.

¿Cómo se define un método de clase y un método estático?

Para definir un método de clase en python, usamos el decorador @classmethod, y para definir un método estático usamos el decorador @staticmethod. 
Veamos un ejemplo para entender la diferencia entre ambos. Digamos que queremos crear una clase Persona. Ahora, Python no admite la sobrecarga de métodos como C++ o Java, por lo que usamos métodos de clase para crear métodos de fábrica. En el siguiente ejemplo, usamos un método de clase para crear un objeto de persona a partir del año de nacimiento.

Como se explicó anteriormente, usamos métodos estáticos para crear funciones de utilidad. En el siguiente ejemplo, usamos un método estático para verificar si una persona es adulta o no. 

A continuación se muestra la implementación completa 

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

Producción:

21
25
True

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *