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.