Hoy no vamos a aprender comandos nuevos.
Vamos a aprender otra forma de pensar nuestros programas.
nombre = "Pedro" edad = 28 altura = 1.75
¿Qué estamos haciendo acá?
Son
DATOS. Información guardada en variables. Nada más y nada menos.
def saludar(nombre): print("Hola", nombre)
¿Y esto qué es?
Son
FUNCIONES. Acciones. Cosas que el programa puede hacer.
Entonces, hasta hoy, todo nuestro programa era esto: datos por un lado y funciones por el otro.
# auto 1 marca_1 = "Toyota" color_1 = "blanco" velocidad_1 = 0 # auto 2 marca_2 = "Fiat" color_2 = "rojo" velocidad_2 = 0 # ... y así 20 autos más
¿Qué problema le ven a esto?
😵 Un desastre de variables sueltas.
🤔 ¿De quién es cada dato?
😱 ¿Y si mañana quiero 100 autos?
¿Y si pudiéramos guardar juntos los datos y las funciones que pertenecen a la misma cosa?
Datos
marca, color,
velocidad
Funciones
encender(),
frenar()
Una sola cosa
UN AUTO
Eso es Programación Orientada a Objetos.
Una forma de organizar el programa pensando en objetos, como los del mundo real.
Si te olvidás de todo lo demás, acordate de esto
Los objetos tienen información y pueden hacer cosas.
¿Qué TIENE?
¿Qué PUEDE HACER?
Datos
Información que describe al objeto.
Comportamientos
Acciones que el objeto puede realizar.
Una taza, un auto, un perro, un jugador. Todo lo que tiene datos y hace cosas puede ser un objeto.
¿Qué cosas sabemos de este auto?
Todo eso que dijeron tiene un nombre
ATRIBUTOS
Son las características que describen al objeto.
Los atributos pueden cambiar: el auto puede pasar de blanco a negro, o de 0 a 120 km/h.
Ahora: ¿qué puede hacer este auto?
Y eso también tiene nombre
MÉTODOS
Son las acciones que el objeto puede realizar.
Un método es una función… pero que vive adentro del objeto y le pertenece.
¿Qué TIENE?
ATRIBUTOS
Sustantivos. marca, color, vida
¿Qué PUEDE HACER?
MÉTODOS
Verbos. frenar(), atacar()
¿Cuáles son datos?
¿Cuáles son acciones?
Respuesta
Clase
Es el molde. Dice qué van a tener y qué van a poder hacer los autos.
Objeto
Es un auto de verdad, con valores concretos.
“La clase describe.
El objeto existe.”
📄 el plano ≠ 🏠 la casa
🍪 el molde ≠ 🥠 la galletita
📝 la receta ≠ 🍕 la pizza
🚗
Toyota blanco
🚙
Ford negro
🚕
Fiat rojo
1. El concepto general de “celular”
2. El celular que tenés en el bolsillo
3. La ficha vacía de un personaje
4. Tu personaje, nivel 7, llamado Zeta
Respuesta
1. Clase 📄 · 2. Objeto ✅
3. Clase 📄 · 4. Objeto ✅
Truco: si le podés poner valores concretos, es un objeto.
Ya lo pensamos.
Ya lo dibujamos.
Ahora lo escribimos.
Ojo: la sintaxis es lo menos importante de hoy. Si algo no se entiende del todo, no pasa nada.
class Auto: def __init__(self, marca, color): self.marca = marca self.color = color def encender(self): print("El auto está encendido")
Línea 1
Acá arranca el molde. Se llama Auto, con mayúscula.
El bloque del medio
Los atributos: qué va a tener cada auto.
El bloque de abajo
Un método: qué va a poder hacer.
def __init__(self, marca, color):
__init__ · viene de “iniciar”
El momento en que nace el objeto
Se ejecuta sola, una sola vez: cuando escribís Auto("Toyota", "blanco"). Ahí el auto recibe sus datos.
self · quiere decir “yo”
El objeto hablando de sí mismo
self.marca es “mi marca”. Es el auto refiriéndose a sus propios datos.
Y no, no hace falta que entiendan por qué lleva guiones bajos. Python es así: se escribe y se sigue. ✌️
mi_auto = Auto("Toyota", "blanco")
¿Qué acabamos de hacer?
Respuesta
Usamos el molde y fabricamos un auto de verdad. Ahora mi_auto existe, con marca Toyota y color blanco.
auto_1 = Auto("Toyota", "blanco") auto_2 = Auto("Fiat", "rojo")
¿Son el mismo auto?
Respuesta
No. Salieron del mismo molde, pero son dos autos distintos e independientes. Una clase, infinitos objetos.
✗ Antes · 3 autos
marca_1 = "Toyota" color_1 = "blanco" velocidad_1 = 0 marca_2 = "Fiat" color_2 = "rojo" velocidad_2 = 0 marca_3 = "Ford" color_3 = "negro" velocidad_3 = 0
9 variables sueltas. Con 20 autos: 60 variables.
✓ Ahora · los mismos 3 autos
auto_1 = Auto("Toyota", "blanco") auto_2 = Auto("Fiat", "rojo") auto_3 = Auto("Ford", "negro")
3 líneas. Con 20 autos: 20 líneas.
El molde se escribe una sola vez.
Cada dato volvió a tener dueño.
print(auto_1.marca) # Toyota print(auto_2.marca) # Fiat auto_1.color = "negro" # lo pintamos print(auto_1.color) # negro print(auto_2.color) # rojo ← no se tocó
El . significa “de”: auto_1.color es el color de auto_1.
auto_1.encender() # El auto está encendido
Sin paréntesis
auto_1.color
es un dato
Con paréntesis
auto_1.encender()
es una acción
class Auto: def __init__(self, marca): self.marca = marca self.velocidad = 0 def acelerar(self): self.velocidad = self.velocidad + 20
print(auto_1.velocidad) # 0 auto_1.acelerar() auto_1.acelerar() print(auto_1.velocidad) # 40
¿Quién cambió la velocidad?
El auto se cambió a sí mismo. Nadie tocó el dato desde afuera.
def encender(self): print("Encendido", self.marca) auto_1.encender() # self = auto_1 auto_2.encender() # self = auto_2
self quiere decir “este objeto”: el que está usando el método justo ahora.
Es cómo el auto se refiere a sí mismo. Nada más que eso.
✋ Con esto alcanza por hoy. Seguimos.
✅ Dos atributos: nombre y edad
✅ Un método: ladrar()
✅ Creá dos perros distintos
class Perro: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def ladrar(self): print("¡Guau!") firulais = Perro("Firulais", 3) laika = Perro("Laika", 7)
Nadie inventó los pilares para tomar examen. Salieron de cuatro problemas reales.
🔐
¿Cómo protejo lo importante?
🧬
¿Cómo no repito lo mismo mil veces?
🎭
¿Cómo doy una orden a cosas distintas?
🎨
¿Cómo escondo lo complicado?
🔐
¿Le darías las llaves del motor de tu auto a cualquier persona?
Y en el programa, lo mismo
Hay información que no queremos que cualquiera modifique directamente.
✗ Todo abierto
auto.velocidad = 500
El auto está apagado y ya va a 500. El dato miente.
✓ Con control
auto.acelerar()
El auto se fija si está encendido y sube de a poco, hasta su máximo.
🔐 “No todo se toca directamente.”
jugador.vida = -999999
¿Debería cualquier parte del juego poder hacer esto?
Lo que queremos
Que la vida se cambie solo a través de jugador.recibir_daño(20), que se fija que nunca baje de 0.
class Jugador: def __init__(self, nombre): self.nombre = nombre self.vida = 100 def recibir_daño(self, cantidad): self.vida = self.vida - cantidad if self.vida < 0: self.vida = 0 # nunca menos de 0
jugador.recibir_daño(30) print(jugador.vida) # 70 jugador.recibir_daño(500) print(jugador.vida) # 0, no -430
Ahí está el candado
El if es la única razón por la que la vida no queda en negativo. Ese control vive adentro del objeto.
¿Un perro es un animal?
¿Un gato es un animal?
Entonces… ¿por qué escribiríamos nombre, edad, comer() y dormir() dos veces?
La regla mental para saber si conviene heredar
“ES UN”
Si no podés decir “es un”, probablemente no sea herencia.
un motor es un auto → el motor está en el auto, es distinto.
¿Cuál va arriba: Instrumento o Guitarra?
¿Qué pondrías en la clase de arriba?
¿Y qué no pondrías ahí?
Una respuesta posible
Arriba: Instrumento → nombre, material, afinar(), sonar()
Abajo: Guitarra → cuerdas, rasguear() · Piano → teclas
En la de arriba va solo lo que comparten todos. cuerdas no va: el piano no tiene.
class Animal: def __init__(self, nombre): self.nombre = nombre def comer(self): print(self.nombre, "está comiendo") class Perro(Animal): # Perro ES UN Animal def ladrar(self): print("¡Guau!")
firulais = Perro("Firulais") firulais.ladrar() # ¡Guau! firulais.comer() # Firulais está comiendo
La pregunta del millón
¿Dónde está escrito comer() adentro de Perro?
En ningún lado. Lo heredó.
¡Guau!
¡Miau!
¡Cuac!
Mismo mensaje.
Distinto comportamiento.
for animal in [perro, gato, pato]: animal.hacer_sonido() # cada uno sabe qué hacer
Yo no necesito saber cuál es cuál. Cada objeto sabe cómo responder.
Caso A
El botón “abrir” en un mail, en una foto y en un juego.
Caso B
La tecla espacio en YouTube, en un shooter y en un formulario.
Caso C
El método imprimir() en una factura, una foto y un ticket.
Lo que tienen en común
En los tres: una sola orden, y cada cosa la interpreta a su manera. Eso es polimorfismo.
class Perro(Animal): def hacer_sonido(self): print("¡Guau!") class Gato(Animal): def hacer_sonido(self): print("¡Miau!") class Pato(Animal): def hacer_sonido(self): print("¡Cuac!")
for a in [perro, gato, pato]: a.hacer_sonido() # ¡Guau! # ¡Miau! # ¡Cuac!
Contá los if
Cero. El for no sabe ni le importa quién es cada uno. Cada objeto sabe responder.
🎨
Cuando apretás el freno, ¿sabés exactamente qué pasa adentro del auto?
Y sin embargo, frenás igual. 🦶
Lo que vos escribís
auto.frenar()
Lo que pasa adentro
def frenar(self): self.calcular_presion() self.activar_pistones() if self.derrapando: self.activar_abs() self.encender_luces() self.velocidad = 0
🎨 “Me quedo con lo importante y escondo lo complicado.”
Tenés que hacer la clase Televisor. Por dentro es un monstruo: señal, pixeles, sonido, wifi…
¿Qué métodos le ofrecerías a quien la usa?
Lo que casi siempre alcanza
Cuatro botones para algo que por dentro tiene miles de piezas. Eso es abstraer.
🎮
Diseñemos un videojuego.
Sin escribir una línea de código. Solo pensando como programadores.
Ustedes dicen, yo anoto.
¿Qué información tiene?
¿Qué puede hacer?
Datos → atributos · Acciones → métodos. Las mismas dos preguntas de siempre.
El Jugador y el Enemigo… ¿qué tienen en común?
⚔️ espadazo
🔥 bola de fuego
🎯 flecha
De todo lo que tiene el Jugador, ¿qué hay que proteger?
🔒 Proteger
Solo se cambian con métodos: recibir_daño(), cobrar(), subir_nivel().
🔓 Se pueden tocar
Si te cambiás el nombre, no se rompe nada.
jugador.atacar()
¿Necesitás saber todo lo que pasa adentro para usarlo?
Lo que pasa realmente
buscar_enemigo_cercano() → calcular_daño(arma, nivel) → reproducir_animacion() → reproducir_sonido() → aplicar_daño() → actualizar_pantalla()
Seis pasos, una sola línea. El que usa el objeto solo necesita atacar().
1
Objeto
Tiene datos y hace cosas.
2
Clase
El molde que los fabrica.
3
Atributos
Lo que el objeto tiene.
4
Métodos
Lo que el objeto hace.
“La clase describe. El objeto existe.”
Encapsulación
No todo se toca directamente.
Herencia
Si es un, lo hereda y no lo repetimos.
Polimorfismo
Misma orden, distinta respuesta.
Abstracción
Me quedo con lo importante, escondo lo complicado.
¿Qué objetos existirían?
Y ahora la difícil: ¿qué dato de Libro protegerías?
🧠 ¿Qué objetos existen?
🔐 ¿Qué necesitamos proteger?
📦 ¿Qué información tienen?
🧬 ¿Qué podemos reutilizar?
⚙️ ¿Qué pueden hacer?
🎭 ¿Qué se comporta de distintas maneras?
🎨 ¿Qué complejidad podemos esconder?
Elegí 3 objetos: uno de tu casa, uno de la escuela y uno de un juego que juegues.
Para cada uno, escribí
¿Qué TIENE? → 3 atributos
¿Qué PUEDE HACER? → 3 métodos
Truco: los atributos son sustantivos, los métodos son verbos con ().
Ejemplo resuelto
MOCHILA 🎒
EJERCICIO 1
En cada par, ¿cuál es la clase y cuál el objeto?
a. receta de pizza / la pizza de anoche
b. perro / tu perro
c. ficha de personaje / Kratos nivel 40
EJERCICIO 2
Armá el árbol con: Vehículo, Bicicleta, Auto, Camión.
¿Quién va arriba? ¿Qué atributos y métodos pondrías en la de arriba, para no repetirlos?
EJERCICIO 3 · la difícil
¿Cuál de estas NO es herencia?
🐱 un gato es un animal
🛞 una rueda es un auto
🧑🏫 un profesor es una persona
Explicá por qué.
🔐 Encapsulación
Nombrá un dato de una app tuya que no podés cambiar a mano. ¿Por qué está bien que sea así?
🧬 Herencia
Un post, una historia y un reel: ¿qué comparten? ¿Cómo llamarías a la clase padre?
🎭 Polimorfismo
El botón ▶️ en Spotify, en YouTube y en un juego: misma orden. ¿Misma respuesta?
🎨 Abstracción
Cuando mandás un audio por WhatsApp, ¿qué cosas no necesitás saber para poder mandarlo?
class Mascota: def __init__(self, nombre): self.nombre = nombre self.energia = 100 def jugar(self): # ← completá vos
1. Que jugar() baje la energía en 20.
2. Que la energía nunca baje de 0.
3. Creá 2 mascotas y hacé que una juegue 6 veces.
Si lo resolvés, usaste atributos, métodos, self, __init__ y encapsulación, todo junto.
POO no se trata de memorizar cuatro palabras.
“Hoy no aprendimos una sintaxis nueva.
Aprendimos una forma nueva de pensar nuestros programas.”
Nos vemos la próxima 👋