Introducción a la Programación Orientada a Objetos (POO)
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.