Ubunlog Diego Germán González  

Curso de programación en Python con Linux Parte 4

Programa en Python ilustrando el concepto de herencia de clases

En los tiempos del humo generado por las empresas de Inteligencia Artificial y sus propagandistas, aprender programación sigue siendo más necesario que nunca. En esta cuarta parte del curso de programación en Python con Linux seguiremos explicando como entender el paradigma de Programación orientada a Objetos. Recuerda que el enlace a la lección anterior está al final del post.

Aunque los agentes y modelos de Inteligencia Artificial sean capaces de entender y escribir código, todavía sigue siendo necesario que un humano sea capaz de darles instrucciones detalladas de lo que tiene que hacer. Para esto no solo hay que entender el problema que se quiere resolver con la aplicación sino también diseñar la solución teniendo en cuenta las características del lenguaje.

Vamos a ver si dejamos en claro esto con una analogía.

Los obreros construyen los rascacielos. Pero, antes de empezar la construcción se necesitan arquitectos que diseñen los planos, ingenieros que hagan los cálculos estructurales y diseñen las conexiones eléctricas, de gas y agua.  Cuando el edificio esté terminado otras personas deberán determinar el diseño de interiores . Por supuesto que, tal vez trabajadores de experiencia podrían hacer un trabajo competente, siempre que no se presenten complicaciones. Pero, en la práctica nadie quiere apostar a eso.

La realidad es que el vibe coding da mejores resultados cuanto más detalladas son las instrucciones y, que grandes empresas han sufrido interrupciones de servicio y borrado bases de datos irreemplazables por agentes de Inteligencia Artificial demasiado emprendedores con instrucciones insuficientes.

Curso de programación en Python con Linux

Habíamos visto en los artículos anteriores que el modelo de Programación Orientada a Objetos se basa en  4 pilares: objetos, clases, métodos y atributos. Las clases son las plantillas donde se modelan los objetos o entidades sobre las cuales trabajamos. Esas plantillas indican los atributos que tendrán los objetos mientras que los métodos marcan el comportamiento del objeto.

A los diferentes elementos creados con el molde establecido en las clases se lo denominan instancias. Por ejemplo, dentro de la clase Sistemas Operativos tenemos las instancias: Linux, Windows, macOS. Ahora bien, es posible que nos interese crear clases que se diferencien poco de clases ya creadas. No es necesario volver a escribir código ya que podemos aprovechar una característica de la Programación Orientada a Objetos conocida como herencia.

Veamos el siguiente programa con una clase agregada.

El motivo por el cual no pego el código directamente en el artículo es, como ya expliqué, es que la plataforma que usamos para publicar el blog no soporta la indentación. Esta práctica consiste en agregar espacios o tabulaciones (nota lo de o tabulaciones ya que no pueden mezclarse) haciendo que el código sea más fácil de entender.

Con la indentación es más fácil estructurar el código de manera jerárquica
diferenciando bloques del código como bucles, funciones o clases. Además, si no indentas adecuadamente los programas en Python no funciona.

Ahora vamos al análisis del programa línea por línea.

class Sistemas:

Como vimos, este programa crea la plantilla sobre la cuál se van a crear las instancias de sistemas operativos.

def __init__(self, nombre, version, derivada):

Acá estamos construyendo la clase. La primera parte es un método automatizado que se utiliza cada vez que se crea una. Lo que está entre paréntesis son los parámetros que va a tener el objeto. Self se usa siempre y hace referencia al objeto. En todos los casos va primero.  Los otros parámetros son los que establecimos en clases anteriores, el nombre de la distribución Linux, la versión  y de cuál distribuicón es derivada.

self.nombre = nombre
self.version = version
self.derivada = derivada

Estas líneas se usan para crear los atributos del objeto. Son variables específicas del objeto que actúan como variables dentro del mismo y los conservarán para cuando se necesiten.

def mostrar_info(self):

Este método define cómo se mostrará la información de los atributos del objeto. El parámetro self indica que solo debe usar los parámetros guardados como atributos.

print(f"Nombre: {self.nombre}")
print(f"Versión: {self.version}")
print(f"Derivada: {self.derivada}")

Estas 3 líneas indican que la forma de mostrar la información de los atributos es imprimiéndolas en pantalla.

class SistemaConPeso(Sistemas):

Acá es donde se modifica nuestro programa con respecto al anterior. Agregamos una nueva clase extendida construida a partir de la anterior. De ahí que al nombre de la clase se le agregue el nombre de la clase anterior entre paréntesis.

def __init__(self, nombre, version, derivada, peso):

Este es constructor de la clase hija, casi igual al que vimos antes pero agregando el parámetro peso.

super().__init__(nombre, version, derivada)

Para no repetir código le indicamos al programa con la instrucción super que la tarea de ocuparse de nombre, versión y derivada es de la clase padre.

self.peso = peso

Todavía teníamos que ocuparnos de guardar el atributo peso.

def mostrar_info(self):

Como de lo que se trata es de no escribir código de más, en lugar de crear una nueva función que muestre el dato adicional vamos a modificar la que ya teníamos.
super().mostrar_info()

Llama al método de la clase padre para establecer como deben mostrarse los atributos guardados en ella.
print(f"Peso: {self.peso}

Agrega la información sobre cómo deben mostrarse los datos de la clase actual.

sistema = SistemaConPeso("Linux Mint", "22", "Ubuntu", "3GB")

Crea el objeto donde se guardará la información con el nuevo parámetro agregado y lo guarda en la variable sistema.

sistema.mostrar_info()

Llama al método encargado de mostrar la información

Por supuesto, que este programa no tiene usos prácticos reales. No tendría ningún sentido tener que introducir los valores de los atributos en el código ya que se necesitaría un programador cada vez que es necesario modificar algo. Como vimos en el ejemplo del 3 en raya, Python puede recibir y guardar información ingresada por el usuario mediante el teclado. También puede hacerlo leyendo archivos o interactuadno con bases de datos.

Pero, tuvo su utilidad para hacer más claros conceptos claves de la programación orientada a objetos como clases, atributos, constructores, métodos, herencia y polimorfismo. Prometo que en el próximo artículo termino de hablar de la Programación Orientada a Objetos y empiezo a hablar de cómo se hacen las cosas en Python

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.