Ir al contenido

Programación orientada a objetos

Publicado: a las  05:11 PM

Introducción a la Programación Orientada a Objetos (POO)

Markdown

La Programación Orientada a Objetos (POO) es un paradigma de programación que utiliza “objetos” para diseñar aplicaciones y programas. Estos objetos representan entidades del mundo real, como un coche, una persona o una cuenta bancaria, y tienen tanto atributos (datos) como comportamientos (métodos).

¿Qué es un objeto?

En POO, un objeto es una instancia de una clase. Una clase es como un plano o plantilla que define las características y comportamientos comunes de un conjunto de objetos.

Ejemplo sencillo: La clase Coche

Imaginate que estás desarrollando una aplicación que gestiona una flota de coches. Podrías empezar definiendo una clase Coche:

class Coche:
    def __init__(self, marca, modelo, color):
        self.marca = marca
        self.modelo = modelo
        self.color = color

    def arrancar(self):
        print(f"El {self.marca} {self.modelo} está arrancando.")

    def frenar(self):
        print(f"El {self.marca} {self.modelo} está frenando.")

Creación de objetos

Una vez que tenés la clase Coche, podés crear objetos (instancias de la clase):

coche1 = Coche("Toyota", "Corolla", "Rojo")
coche2 = Coche("Ford", "Mustang", "Negro")

Ahora, coche1 y coche2 son objetos distintos, cada uno con sus propios atributos.

Uso de métodos

Podés hacer que estos objetos realicen acciones utilizando los métodos definidos en la clase:

coche1.arrancar()  # Salida: El Toyota Corolla está arrancando.
coche2.frenar()    # Salida: El Ford Mustang está frenando.

Principios fundamentales de la POO

La POO se basa en cuatro principios fundamentales:

1. Herencia

La herencia permite crear nuevas clases basadas en clases existentes. La nueva clase, llamada subclase, hereda los atributos y métodos de la clase base.

class CocheElectrico(Coche):
    def __init__(self, marca, modelo, color, autonomia):
        super().__init__(marca, modelo, color)
        self.autonomia = autonomia

    def cargar_bateria(self):
        print(f"El {self.marca} {self.modelo} está cargando la batería.")

Aquí, CocheElectrico hereda de Coche y añade un nuevo atributo autonomia y un método cargar_bateria.

2. Encapsulamiento

El encapsulamiento es el proceso de restringir el acceso directo a algunos de los componentes de un objeto. Esto se hace para proteger los datos y asegurar que se manipulen de manera controlada.

class Coche:
    def __init__(self, marca, modelo, color, velocidad_maxima):
        self.marca = marca
        self.modelo = modelo
        self.color = color
        self.__velocidad_maxima = velocidad_maxima  # Atributo privado

    def mostrar_velocidad_maxima(self):
        return self.__velocidad_maxima

En este ejemplo, __velocidad_maxima es un atributo privado, lo que significa que no puede ser accedido directamente desde fuera de la clase.

3. Polimorfismo

El polimorfismo permite que objetos de diferentes clases sean tratados como objetos de una clase común. Esto es útil cuando diferentes clases tienen un método con el mismo nombre.

class CocheDeportivo(Coche):
    def arrancar(self):
        print(f"El {self.marca} {self.modelo} arranca con un rugido poderoso.")

Ambas clases Coche y CocheDeportivo tienen un método arrancar, pero su comportamiento puede ser diferente.

4. Abstracción

La abstracción consiste en ocultar los detalles complejos de un sistema y exponer solo lo esencial. En POO, se consigue a través de clases y objetos que solo muestran las funcionalidades necesarias al usuario final.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sonido(self):
        pass

class Perro(Animal):
    def sonido(self):
        return "Ladra"

class Gato(Animal):
    def sonido(self):
        return "Maulla"

Aquí, Animal es una clase abstracta que define un método sonido que debe ser implementado por cualquier subclase, como Perro o Gato.

Conclusión

La Programación Orientada a Objetos es un poderoso paradigma que facilita la creación de software modular, reutilizable y fácil de mantener. Al utilizar clases y objetos, podemos modelar el mundo real de manera más intuitiva y trabajar de manera más eficiente en nuestros proyectos.