Uso del decorador @classmethod para métodos de clase en Python

Un método de clase en Python es una función vinculada a la clase y no a una instancia. Se define utilizando el decorador @classmethod y toma como primer parámetro la clase misma, convencionalmente nombrado cls.

La sintaxis para definir un método de clase es la siguiente:

@classmethod
def nombre_del_metodo(cls, parametros_adicionales):

Este enfoque reemplaza el uso de la función classmethod(), consdierada menos idiomática en versiones recientes de Python. El parámetro cls permite acceder a atributos y métodos de la clase directamente.

Ejemplo básico de un método de clase:

class Vehiculo:
    ruedas = 4

    @classmethod
    def mostrar_info(cls):
        print(f"Instancia de {cls.__name__} con {cls.ruedas} ruedas")

# Llamada directa desde la clase
Vehiculo.mostrar_info()

Salida: Instancia de Vehiculo con 4 ruedas

Los métodos de clase son frecuentemente empleados como métodos de fábrica para crear instancias de maneras alternativas. A continuación, un ejemplo que calcula la edad a partir del año de nacimiento:

from datetime import date

class Estudiante:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    @classmethod
    def desde_ano_nacimiento(cls, nombre, ano_nacimiento):
        edad_calculada = date.today().year - ano_nacimiento
        return cls(nombre, edad_calculada)

    def presentar(self):
        print(f"{self.nombre}, {self.edad} años")

# Uso del método de fábrica
estudiante1 = Estudiante.desde_ano_nacimiento("María", 2000)
estudiante1.presentar()

Salida: María, 24 años (asumiendo el año actual 2024)

En el contexto de la herencia, los métodos de clase aseguren la creación correcta de instancias de la clase derivada. Considere el siguiente caso:

class Animal:
    def __init__(self, especie, nombre):
        self.especie = especie
        self.nombre = nombre

    @classmethod
    def desde_nombre_comun(cls, nombre_comun):
        # Lógica simplificada para mapeo
        especie = "Desconocida"
        if nombre_comun == "Fido":
            especie = "Perro"
        return cls(especie, nombre_comun)

class Mascota(Animal):
    domestica = True

# Creación a través del método de clase en la subclase
mascota = Mascota.desde_nombre_comun("Fido")
print(isinstance(mascota, Mascota))  # Devuelve True

En contraste, un método estático definido con @staticmethod no recibe la clase como primer argumento y podría no generar instancias de la subclase adecuadamente en escenarios de herencia.

Etiquetas: Python classmethod decorador métodos_de_clase herencia

Publicado el 7-8 19:07