La sobrecarga de métodos (method overloading) ocurre cuando una clase define múltiples métodos con el mismo nombre pero diferentes parámetros. Sin embargo, Python no admite sobrecarga de métodos de la misma manera que lenguajes como Java o C++. En Python, si se define un método con el mismo nombre más de una vez, la última definición sobrescribe a las anteriores.
Ejemplo de Sobrecarga (Que No Funciona en Python)
class Calculadora:
def sumar(self, a, b):
return a + b
def sumar(self, a, b, c): # Sobrescribe el método anterior
return a + b + c
calc = Calculadora()
print(calc.sumar(2, 3)) # Error: Argumentos incorrectos
El método sumar(a, b) se sobrescribe con sumar(a, b, c), por lo que llamar sumar(2, 3) genera un error.
Dado que Python no permite sobrecarga nativa, podemos lograr un comportamiento similar con valores por defecto, *args y @singledispatch.
Podemos definir parámetros opcionales para manejar diferentes cantidades de argumentos.
class Calculadora:
def sumar(self, a, b, c=0): # c es opcional
return a + b + c
calc = Calculadora()
print(calc.sumar(2, 3)) # 5 (usa c=0 por defecto)
print(calc.sumar(2, 3, 4)) # 9 (usa c=4)
Esto imita la sobrecarga permitiendo diferentes cantidades de argumentos.
Si queremos permitir una cantidad dinámica de argumentos, podemos usar *args.
class Calculadora:
def sumar(self, *args):
return sum(args) # Suma todos los argumentos recibidos
calc = Calculadora()
print(calc.sumar(2, 3)) # 5
print(calc.sumar(2, 3, 4, 5)) # 14
Aquí *args permite cualquier número de argumentos.
El decorador functools.singledispatch permite definir funciones con el mismo nombre pero con diferentes tipos de argumento.
from functools import singledispatch
@singledispatch
def procesar(valor):
raise NotImplementedError("Tipo no soportado")
@procesar.register(int)
def _(valor):
return f"Procesando número: {valor}"
@procesar.register(str)
def _(valor):
return f"Procesando texto: {valor.upper()}"
print(procesar(10)) # Procesando número: 10
print(procesar("hola")) # Procesando texto: HOLA
Este enfoque permite sobrecargar la función dependiendo del tipo de dato del argumento.