8 - Introducción a la Programación Orientada a Objetos

Lección 8 del curso Python Nivel Avanzado.

Introducción

En la lección anterior desarrollamos la primera práctica del curso, en donde vimos cómo realizar el manejo avanzado de archivos en Python.

En esta segunda sección del curso veremos en detalle la Programación Orientada a Objetos, uno de los enfoques más usados actualmente en el desarrollo de software, pues nos permite elaborar programas cada vez más complejos usando un enfoque modular que hace que sean más fáciles de mantener que los programas que hemos elaborado hasta el momento.

Entonces en esta lección veremos una introducción a lo que es la programación orientada a objetos, aprenderemos algunos conceptos básicos y veremos sus principales diferencias frente a la programación procedimental y funcional que hemos usado hasta el momento.

Suscríbete para tener acceso al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Intuición acerca de la Programación Orientada a Objetos

Partamos de un ejemplo hipotético que nos permitirá entender la utilidad de la Programación Orientada a Objetos.

Supongamos que queremos desarrollar un programa que nos permita extraer información relevante acerca de las ventas de diferentes productos en una tienda por departamentos.

Si miramos en detalle cada producto encontraremos que tiene algunas características básicas, como por ejemplo:

Si miramos el registro de ventas de un mes encontraremos un listado con esta información especificando las ventas diarias (en unidades y en monto total) de cada uno de los productos.

Y supongamos que nos interesa determinar el monto de las ventas para cada categoría de producto durante ese mes.

Para resolver este problema podríamos usar varios enfoques.

Usando listas

Podríamos por ejemplo crear una lista de Python por cada producto y en esta lista incluir todos los detalles del producto.

Luego podríamos crear una función que por cada lista (es decir por cada producto) extraiga el precio y cruce esta información con el registro de ventas mensuales para determinar el monto total de ventas de ese mes para cada producto.

Usando diccionarios

Otra alternativa podría ser usando diccionarios en lugar de listas. Así, tendríamos un diccionario de productos donde cada ítem contendría la información detallada de cada producto.

Luego podríamos crear una función que visite de forma iterativa cada item del diccionario (es decir cada categoría de producto), extraiga el precio y cruce esta información con el registro de ventas mensuales.

Así que este enfoque es similar al de las listas, con la ventaja de que en este caso tenemos todos los productos agrupados en un sólo objeto (un diccionario de Python).

Desventajas de las listas y de los diccionarios

La desventaja de usar cualquiera de los métodos anteriores (listas o diccionarios) es que nuestro código no resultaría tan fácil de entender y de mantener a futuro.

Por ejemplo, para acceder al precio de cada producto debemos:

El hecho de acceder al dato de interés a través de índices no es intuitivo ni tampoco flexible.

En estos ejemplos de listas y diccionarios lo que estamos usando es un enfoque de programación procedimental y funcional: procedimental porque hemos estructurado nuestro programa como una serie de instrucciones o procedimientos que se ejecutan de manera secuencial (lea cada lista/diccionario, busque un ítem en particular, vaya al registro mensual de ventas, calcule el monto total de ventas) y funcional porque hemos agregado una función que conecta la información de los productos con el registro mensual de ventas para extraer la información de interés.

La desventaja de esto es que, como vimos, el código no es flexible y resulta difícil de mantener. Por un lado estamos usando listas o diccionarios para almacenar los datos, y por otro lado estamos usando funciones para operar sobre esos datos.

Tercer enfoque: la Programación Orientada a Objetos

Pero qué pasa si en lugar de tener entidades sólo enfocadas en los datos (listas, diccionarios) o en operar sobre estos (funciones), ¿tuviésemos todo esto en una misma entidad?

Es decir, si tuviésemos una “entidad” que pudiese a la vez tanto almacenar como operar sobre los datos. En este caso nuestro código sería más compacto y no estaría disperso y por tanto estaría más organizado y sería más fácil de mantener.

¿Qué es la programación orientada a objetos?

Teniendo en cuenta el ejemplo anterior podemos definir la Programación Orientada a Objetos como un enfoque de programación en donde tanto las propiedades (los datos) se combinan junto con los comportamientos (las funciones) en algo que se conocen como objetos.

Así que en un programa que haga uso de la Programación Orientada a Objetos, en lugar de escribir funciones o procedimientos lo que haremos será crear objetos y hacer que interactúen para cumplir una finalidad determinada.

Conceptos básicos: atributos y métodos

Muy bien, teniendo claro lo que es la Programación Orientada a Objetos, comencemos a ver algunas definiciones y terminología básica.

Hace un momento mencionamos que un objeto tiene unas características (unos datos) y unas funciones (un comportamiento) asociados. El nombre que damos a estas características es atributos, mientras que el nombre que damos a esas funciones es métodos.

Conceptos básicos: las clases

Una clase es simplemente como la plantilla que usaremos en nuestro programa para definir un objeto en particular. Con esta clase definiremos los métodos y atributos básicos de un objeto.

Conceptos básicos: las instancias

Pero tan sólo con la clase no resulta suficiente para implementar nuestro programa. La clase es la plantilla de un objeto, pero no es como tal el objeto creado en memoria a través del cual podemos generar las interacciones.

Una vez tenemos nuestra plantilla (clase) debemos crear un objeto en memoria. Una vez creamos el objeto en memoria tendremos lo que se conoce como una instancia: una versión tangible de esta plantilla, con la cual podemos interactuar.

Conceptos básicos: herencia

Cuando hablamos del ejemplo inicial, vimos que las listas o los diccionarios no eran flexibles pues resultaba más complicado agregar características como el color del producto o como el tipo de calzado.

En Programación Orientada a Objetos podemos resolver este inconveniente usando algo que se conoce como herencia. Es decir podemos tener un producto básico (una clase padre) que contenga las características esenciales del producto (como por ejemplo el nombre, la descripción y la categoría), pero luego podemos tener productos hijos que tengan estas características básicas pero además características adicionales (como la sub-categoría, el color, el material).

Así que estos objetos hijos heredan los elementos del objeto padre, pero además podemos añadirle otros métodos y atributos que nos permitan “personalizarlo”. Esto se conoce como herencia.

Recuerda suscribirte para acceder al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

Como hemos visto la Programación Orientada a Objetos es un un paradigma de programación que resulta muy útil cuando tenemos programas que aumentarán su complejidad en el tiempo, pues en ese caso resulta útil tener objetos que contengan atributos y métodos específicos, que nos permitirán tener un código más organizado, más flexible y más fácil de mantener y de modificar a futuro.

Este enfoque sin embargo no reemplaza la programación procedimental o funcional que podemos seguir usando en el caso en el que nuestros programas no sean tan extensos o si sabemos que estos no serán más complejos en un futuro.

Muy bien y con todo esto ya estamos listos para ir a Python y comenzar a ver cómo implementar la Programación Orientada a Objetos. Así que en la próxima lección comenzaremos con el elemento básico: veremos cómo crear una clase en Python.

Ver todas las lecciones de este curso