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.
# 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
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.
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:
En POO, ¿cuál es la diferencia entre una Clase y un Objeto?
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).
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".
Una clase Persona tiene el atributo edad. Para que nadie pueda poner
una edad negativa como -5, ¿qué pilar de la POO usarías?
set_edad() validas que sea ≥ 0 antes de guardarla.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.
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.
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!"
Tienes las clases Empleado y Gerente. El Gerente también tiene nombre,
salario y puede trabajar (igual que Empleado). ¿Qué conviene hacer?
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.
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).
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 🎭
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?
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.
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.
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?
MetodoPago
actúa como contrato. Cada método de pago está obligado a implementar pagar() a su manera. Es
abstracción pura.Los 4 pilares de un vistazo — lo que necesitas recordar para el examen.
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.