Los 4 Pilares
de la POO

00
💡 Fundamentos
¿Qué es la POO?
🌍

Un nuevo paradigma

La Programación Orientada a Objetos (POO) es un paradigma de programación que organiza el software en torno a objetos: entidades que combinan datos (atributos) y comportamientos (métodos). En lugar de pensar en funciones aisladas

❌ Antes — Programación Estructurada
  • El código se divide en funciones
  • Los datos y la lógica están separados
  • Difícil de escalar en proyectos grandes
  • No modela el mundo real de forma natural
  • Ejemplos: C, Pascal, BASIC
✅ Ahora — POO
  • El código se organiza en objetos
  • Datos y comportamiento van juntos
  • Fácil de mantener y ampliar
  • Modela el mundo real de forma intuitiva
  • Ejemplos: Python, Java, C++, C#

🔑 Conceptos clave: Clase vs Objeto

Una clase es el molde o plantilla. Define cómo van a ser los objetos de ese tipo. Un objeto es una instancia concreta de esa clase — la cosa real creada a partir del molde.

Por ejemplo: Perro es la clase (el molde genérico). Rex o Firulais son objetos — perros reales creados desde esa clase. Cada uno tiene su propio nombre y edad, pero ambos comparten la estructura definida por la clase.

🏗️
Clase
El plano o molde que define cómo serán los objetos: sus atributos y métodos.
📦
Objeto
Una instancia concreta de una clase. La "cosa real" creada desde el molde.
🏷️
Atributos
Los datos o propiedades de un objeto. Ej: nombre, edad, color.
⚙️
Métodos
Las acciones o comportamientos que puede ejecutar un objeto. Ej: correr(), comer().
🔨
Constructor
Método especial que se llama al crear un objeto para configurar sus atributos iniciales.
💬
Mensajes
Los objetos se comunican entre sí enviándose mensajes (llamadas a métodos).
🐍 Clase y Objeto en Python — Lo más básico
# 1. Definimos la CLASE (el molde)
class Perro:
    def __init__(self, nombre, raza):   # Constructor
        self.nombre = nombre             # Atributo
        self.raza   = raza               # Atributo

    def ladrar(self):                    # Método
        print(f"¡{self.nombre} dice: Guau! 🐶")

# 2. Creamos OBJETOS (instancias) a partir de la clase
rex     = Perro("Rex",     "Pastor Alemán")
firulais = Perro("Firulais", "Labrador")

rex.ladrar()      # ¡Rex dice: Guau!
firulais.ladrar() # ¡Firulais dice: Guau!
print(rex.raza)   # Pastor Alemán

🚀 ¿Por qué usar POO?

Los lenguajes modernos como Python, Java y C++ adoptaron POO porque permite modelar el mundo real de forma natural. Facilita trabajar en equipos grandes, reutilizar código entre proyectos y mantener aplicaciones complejas sin que todo se convierta en un caos.

♻️
Reutilización de código
🔧
Fácil mantenimiento
📐
Código organizado
🐛
Más fácil depurar

🏛️ Los 4 Pilares — Una primera vista

La POO se sostiene sobre cuatro conceptos fundamentales. Cada uno resuelve un problema diferente al organizar el código. A continuación los explorarás en detalle:

🔒
Encapsulamiento
Proteger
Oculta los datos internos y controla el acceso.
🧬
Herencia
Reutilizar
Una clase recibe atributos y métodos de otra.
🎭
Polimorfismo
Flexibilidad
El mismo método, comportamientos distintos.
🧩
Abstracción
Simplificar
Muestra lo esencial, oculta la complejidad.

🧠 Pregunta Relámpago

En POO, ¿cuál es la diferencia entre una Clase y un Objeto?

¡Exacto! La clase es como el plano de una casa — describe cómo será. El objeto es la casa construida — es real y ocupa espacio. Puedes crear muchas casas (objetos) desde el mismo plano (clase).
01
🔒 Pilar 1
Encapsulamiento
🏧

Analogía del mundo real

Piensa en un cajero automático. Tú puedes retirar dinero y consultar tu saldo, pero no puedes meter la mano y agarrar los billetes directamente. El banco encapsula el dinero y solo permite acceder a él por los métodos correctos (botones del cajero).

¿Qué es?

Ocultar los datos internos de un objeto y permitir el acceso a ellos solo a través de métodos controlados. Es como poner los datos "dentro de una caja con llave".

¿Cuándo usarlo?

  • Cuando tienes datos sensibles (saldo, contraseña)
  • Cuando quieres validar antes de guardar un valor
  • Para evitar que otros modifiquen datos por error

🧠 Pregunta Relámpago

Una clase Persona tiene el atributo edad. Para que nadie pueda poner una edad negativa como -5, ¿qué pilar de la POO usarías?

¡Correcto! Con encapsulamiento haces la edad privada y en el método set_edad() validas que sea ≥ 0 antes de guardarla.
02
🧬 Pilar 2
Herencia
👨‍👩‍👧

Analogía del mundo real

Como en una familia: un hijo hereda características de sus padres (color de ojos, apellido) pero también puede tener las propias (su personalidad). En código, una clase hija hereda atributos y métodos de la clase padre, sin tener que reescribirlos.

¿Qué es?

Una clase puede heredar atributos y métodos de otra. La clase que hereda se llama hija y la que da la herencia se llama padre o base. Evita repetir el mismo código.

¿Cuándo usarlo?

  • Cuando hay relación "es un": Perro es un Animal
  • Cuando varias clases comparten el mismo código base
  • Para organizar jerarquías (vehículo → auto → auto deportivo)
🐍 Ejemplo en Python — Animales
class Animal:  # Clase PADRE
  def __init__(self, nombre):
    self.nombre = nombre

  def comer(self):
    print(f"{self.nombre} está comiendo 🍖")

class Perro(Animal):  # Clase HIJA — hereda de Animal
  def ladrar(self):
    print("¡Guau! 🐶")

class Gato(Animal):  # Otra clase HIJA
  def maullar(self):
    print("¡Miau! 🐱")

rex = Perro("Rex")
rex.comer()   # heredado del padre ✅ → "Rex está comiendo"
rex.ladrar()  # propio del Perro ✅ → "¡Guau!"

🧠 Pregunta Relámpago

Tienes las clases Empleado y Gerente. El Gerente también tiene nombre, salario y puede trabajar (igual que Empleado). ¿Qué conviene hacer?

¡Exacto! El Gerente es un Empleado con extras. Con herencia reutilizamos el código de Empleado y solo agregamos lo nuevo en Gerente.
03
🎭 Pilar 3
Polimorfismo
📱

Analogía del mundo real

El botón de volumen en tu celular hace lo mismo (subir/bajar volumen), pero en una app de música sube la canción, en una llamada sube el micrófono, y en un video sube el audio del video. Mismo botón, diferente comportamiento según el contexto. Eso es polimorfismo.

¿Qué es?

El mismo método puede comportarse de manera diferente según el objeto que lo ejecute. La palabra viene del griego: poly (muchas) + morphos (formas).

¿Cuándo usarlo?

  • Cuando distintos objetos responden al mismo mensaje
  • Para escribir código genérico y flexible
  • Figuras geométricas, tipos de pago, tipos de usuario
🐍 Ejemplo en Python — Sonidos de animales
class Animal:
  def hacer_sonido(self):
    print("...")

class Perro(Animal):
  def hacer_sonido(self):  # mismo método, diferente resultado
    print("¡Guau! 🐶")

class Gato(Animal):
  def hacer_sonido(self):  # mismo método, diferente resultado
    print("¡Miau! 🐱")

class Vaca(Animal):
  def hacer_sonido(self):  # mismo método, diferente resultado
    print("¡Muuu! 🐮")

animales = [Perro(), Gato(), Vaca()]
for a in animales:
  a.hacer_sonido()  # cada uno responde diferente 🎭

🧠 Pregunta Relámpago

Tienes clases Circulo, Cuadrado y Triangulo. Todas tienen un método calcular_area(). En tu programa haces un for y llamas figura.calcular_area() para cada una sin saber qué tipo es. ¿Qué pilar estás usando?

¡Muy bien! Eso es polimorfismo puro: llamas al mismo método y cada objeto sabe cómo responder. (De paso, también usas herencia si heredan de una clase base 😉).
04
🧩 Pilar 4
Abstracción
🚗

Analogía del mundo real

Para manejar un auto no necesitas saber cómo funciona el motor por dentro. Solo sabes que existe el volante, el acelerador y el freno. El auto abstrae toda la complejidad mecánica y te muestra solo lo esencial. En código, una clase abstracta define qué debe hacerse, sin decir cómo.

¿Qué es?

Mostrar solo lo esencial de un objeto y ocultar los detalles complejos. Define qué debe hacer una clase (el contrato), sin decir cómo lo hace. Se usan clases abstractas e interfaces.

¿Cuándo usarlo?

  • Al diseñar un esqueleto que otras clases deben seguir
  • Cuando varias clases deben tener los mismos métodos pero implementarlos diferente
  • Para crear frameworks, APIs o librerías reutilizables

🧠 Pregunta Relámpago

Quieres que todas las apps de pago (PayPal, Tarjeta, Efectivo) tengan obligatoriamente un método pagar(monto), pero cada una lo procesa diferente. ¿Qué usarías?

¡Perfecto! La clase abstracta MetodoPago actúa como contrato. Cada método de pago está obligado a implementar pagar() a su manera. Es abstracción pura.

Resumen Final 🏆

Los 4 pilares de un vistazo — lo que necesitas recordar para el examen.

🔒
Encapsulamiento
PROTEGER
Oculta los datos internos. Solo se accede a ellos a través de métodos. Como el cajero automático: ves tu saldo pero no tocas los billetes.
🧬
Herencia
REUTILIZAR
Una clase hija hereda atributos y métodos de la clase padre. Como un hijo que hereda características de sus padres pero tiene las propias.
🎭
Polimorfismo
FLEXIBILIDAD
El mismo método, diferente comportamiento según el objeto. Como el botón de volumen que funciona diferente en cada app.
🧩
Abstracción
SIMPLIFICAR
Define qué debe hacer una clase sin decir cómo. Como manejar un auto sin saber cómo funciona el motor.

¿Por qué los lenguajes usan POO?

Los lenguajes como Python, Java y C++ adoptaron POO porque permite modelar el mundo real de forma natural: los objetos representan cosas concretas con datos y comportamientos propios.

Además facilita el mantenimiento del código, promueve la reutilización, y hace que proyectos grandes sean más manejables.