Sobrecarga de operadores
1. Qué es la sobrecarga de operadores? #
La sobrecarga de operadores es una característica en la programación orientada a objetos que te permite definir o cambiar la forma en que los operadores (como +, -, *, etc.) se comportan cuando se aplican a objetos de una clase personalizada. En otras palabras, puedes hacer que los operadores funcionen de manera especial para los objetos de tus propias clases.
2. Cómo funciona la sobrecarga de operadores en Python? #
Para sobrecargar un operador en Python, necesitas definir un método especial en tu clase. Estos métodos tienen nombres específicos que comienzan y terminan con dos guiones bajos (__). Por ejemplo:
__add__: Para sobrecargar el operador+.__sub__: Para sobrecargar el operador-.__mul__: Para sobrecargar el operador*.
3. Ejemplo de sobrecarga de operadores #
Vamos a crear una clase simple para manejar puntos en un plano 2D y sobrecargar el operador + para que sume dos puntos.
1class Punto: 2 def __init__(self, x, y): 3 self.x = x 4 self.y = y 5 6 def __add__(self, otro): 7 return Punto(self.x + otro.x, self.y + otro.y) 8 9 def __str__(self): 10 return f"({self.x}, {self.y})" 11 12# Crear dos objetos de la clase Punto 13punto1 = Punto(1, 2) 14punto2 = Punto(3, 4) 15 16# Usar el operador + para sumar los puntos 17resultado = punto1 + punto2 18 19# Mostrar el resultado 20print(f"La suma de los puntos {punto1} y {punto2} es {resultado}")Salida de consola La suma de los puntos (1, 2) y (3, 4) es (4, 6)
- ¿Qué hace este código?:
- Define una clase
Puntocon atributosxeyque representan las coordenadas del punto. - El método
__add__sobrecarga el operador+para que sume las coordenadasxeyde dos puntos y devuelva un nuevo objetoPunto. - El método
__str__sobrecarga la funciónstr()para proporcionar una representación legible del objeto cuando se imprime. - Se crean dos objetos
punto1ypunto2y se suman usando+, lo que llama al método__add__.
- Define una clase
4. Sobrecarga de otros operadores #
Puedes sobrecargar muchos otros operadores en Python. Aquí hay algunos ejemplos de métodos especiales para operadores comunes:
__sub__(self, otro): Para el operador-.__mul__(self, otro): Para el operador*.__pow__(self, otro): Para el operador**.__truediv__(self, otro): Para el operador/.__eq__(self, otro): Para el operador==.__lt__(self, otro): Para el operador<.
5. Ejemplo de sobrecarga del operador `` #
Vamos a sobrecargar el operador * para multiplicar un punto por un número.
1class Punto: 2 def __init__(self, x, y): 3 self.x = x 4 self.y = y 5 6 def __mul__(self, factor): 7 return Punto(self.x * factor, self.y * factor) 8 9 def __str__(self): 10 return f"({self.x}, {self.y})" 11 12# Crear un objeto de la clase Punto 13punto = Punto(2, 3) 14 15# Multiplicar el punto por un factor 16resultado = punto * 3 17 18# Mostrar el resultado 19print(f"El punto {punto} multiplicado por 3 es {resultado}")Salida de consola El punto (2, 3) multiplicado por 3 es (6, 9)
- ¿Qué hace este código?:
- Define la clase
Puntocon el método__mul__para sobrecargar el operador*. Este método multiplica las coordenadas del punto por un factor. - Se crea un objeto
puntoy se multiplica por3usando*, lo que llama al método__mul__.
- Define la clase
6. Por qué usar la sobrecarga de operadores? #
- Claridad: Permite que las operaciones con objetos de tus clases sean más intuitivas, como sumar puntos o multiplicar vectores.
- Flexibilidad: Puedes definir cómo los operadores estándar deberían comportarse cuando se usan con tus objetos, haciendo tu código más limpio y fácil de entender.
- Reutilización: Puedes hacer que las clases existentes funcionen mejor con operadores sin necesidad de redefinir cómo funcionan internamente.
Resumen del tema
Conceptos clave #
- Sobrecarga con Métodos Mágicos: implementar métodos especiales (
__add__,__sub__,__mul__,__truediv__,__eq__,__lt__) para redefinir el comportamiento de los operadores aritméticos y relacionales. - Operadores Inversos / Reflejados: métodos de prefijo
r(ej.__radd__,__rmul__) para manejar operandos donde la instancia personalizada está a la derecha del operador (3 * punto). - Operadores de Asignación Aumentada: métodos de prefijo
i(ej.__iadd__,__imul__) para operaciones in-place como+=y*=.
Qué debes recordar #
Sobrecargar operadores mediante métodos dunder (__add__, __mul__, etc.) permite dotar a las clases personalizadas de sintaxis matemática limpia y expresiva.