Sobrecarga de operadores en Python

En la Programación Orientada a Objetos (OOP por sus siglas en ingles), la sobrecarga se refiere a la posibilidad de contar con dos o mas funciones con el mismo nombre pero con comportamiento diferentes. La sobrecarga de operadores trata básicamente de lo mismo, solo que en el ámbito de los operadores (+, , *, /, etc).

¿Cuál es la ventaja de contar con esta característica? Para responder esta pregunta deseo mostrarles el siguiente código Java

/*
 * Supongamos que la clase Matriz existe y que su constructor genera un arreglo
 * bidimensional de enteros, relleno de ceros, es decir, para toda celda de la
 * matriz, matriz[i][j] == 0
 */

Matriz mi_matriz = Matriz(10, 20);
Matriz otra_matriz = Matriz(10, 20);

/*
 * Para sumar nuestras matrices, tendríamos que invocar al método del objeto
 * de tipo Matriz llamado Sumar
 */
Matriz matriz_suma = mi_matriz.Sumar(otra_matriz);

Todo bien, pero ¿Y si pudiéramos utilizar el símbolo suma (+) para realizar la última línea del código anterior? ¿No sería eso genial? Pues, de eso se trata la sobrecarga de operadores y ahora les mostraré como hacerlo en Python.

 

Sobrecarga de operadores – Código de ejemplo


class Matriz(object):
    def __init__(self, numero_filas, numero_columnas):
        self.numero_filas = numero_filas

        self.numero_columnas = numero_columnas

        # Revisar mi tutorial "Crear matrices en Python utilizando listas"
        # para mas informacion
        self.arreglo = [[0] * numero_columnas for i in range(numero_filas)]

    def __add__(self, matriz):
        resultado = Matriz(self.numero_filas, self.numero_columnas)

        for i in xrange(self.numero_filas):
            for j in xrange(self.numero_columnas):
                resultado.arreglo[i][j] = self.arreglo[i][j] + matriz.arreglo[i][j]

        return resultado

# ------------------------------------------------------------------------- Main

# Instanciamos nuestras matrices
mi_matriz = Matriz(2, 3)

otra_matriz = Matriz(2, 3)

# Y las sumamos
matriz_suma = mi_matriz + otra_matriz

 

Funciones y Métodos especiales en Python

Existen ciertas funciones y métodos que son tratados de manera especial por el interprete de Python, éstos pueden ser fácilmente reconocidos por comenzar y terminar con dos (2) underscore (o piso, tal y como le dicen en mi país, Venezuela).

__nombre_funcion__

 

En el código de ejemplo se puede apreciar que la clase Matriz posee dos métodos especiales: __init__ y __add__. El método __init__ es el constructor de la clase y como todo constructor, éste es llamado al momento de instanciar un objeto.


variable = Clase()    # El método __init__ es invocado de forma implicita

 

El método __add__, tal y como adivinaron, es el que hace posible la sobrecarga del operador suma. Para Python, la expresión


objeto1 + objeto2

es equivalente a la sentencia


objeto1.__add__(objeto2)

 

Ésto es valido para el resto de los operadores, __mul__ para la multiplicación, __div__ para la divición, __pow__ para la potenciación, etc.

 

Nota:

Para que el código fuese sencillo, he omitido intencionalmente verificar si las dimensiones de las matrices a sumar coinciden. Si así lo desean pueden hacer ésto a modo de ejercicio 😉

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: