Clases y Objetos
0 / 7 nodos
🐍 Guía de Aula Invertida · Mapa conceptual

Clases y Objetos desde cero

Hasta ahora organizaste tu código en funciones. El siguiente paso es organizar datos y comportamiento juntos, dentro de una misma unidad: eso es una clase. Esta guía es un mapa, no una lista de secciones: hacé clic en cualquier nodo, en el orden que prefieras. El recomendado es 1→7, pero no está bloqueado.

💻 Los nodos con ✍️ tienen un editor real (Pyodide, Python de verdad en tu navegador). Un nodo se pinta de verde en el mapa cuando ya lo practicaste.
0 / 0
preguntas y ejercicios enviados
RC
Ing. Roy Carrasco
Facultad de Ingeniería de Sistemas · UAB · 👁 vistas

🗺️ Tocá un nodo para abrirlo. Las líneas punteadas muestran el orden sugerido, pero podés saltar a cualquiera.

1 · Clase

Hasta ahora, cada dato de tu programa vivía en una variable suelta y cada acción en una función suelta. Una clase es un molde que agrupa datos y comportamiento relacionados bajo un mismo nombre: define, de una vez, cómo va a ser cualquier cosa de ese tipo que crees más adelante.

Python
class Perro:
    especie = "Canino"

print(Perro)
print(Perro.especie)
✍️ Tu turno: escribe el código y ejecútalo
class, no def

Una clase se define con la palabra clave class, seguida del nombre y dos puntos —el bloque de adentro va indentado, igual que en una función. La convención de nombres es distinta: las clases se escriben en PascalCase (Perro, CuentaBancaria), con mayúscula inicial y sin guiones bajos, para distinguirlas a simple vista de funciones y variables (snake_case).

Por ahora Perro es solo el molde: todavía no creaste ningún perro concreto. Eso es lo que viene en el siguiente nodo.

2 · Objeto

Un objeto es una instancia concreta de una clase: se crea escribiendo el nombre de la clase seguido de paréntesis, como si la clase fuera una función que "fabrica" objetos. Podés crear tantos objetos como quieras a partir de la misma clase.

Python
class Perro:
    especie = "Canino"

rex = Perro()
firulais = Perro()

print(rex.especie)
print(firulais.especie)
print(type(rex))
✍️ Tu turno: escribe el código y ejecútalo
rex y firulais son objetos distintos

Aunque los dos vienen de la misma clase Perro y comparten el mismo especie, rex y firulais son dos objetos separados en la memoria de la computadora —cambiar uno no afecta al otro. En el nodo "Atributos" vas a ver por qué eso importa de verdad.

3 · Atributos

Un atributo es un dato que pertenece a un objeto en particular, no a la clase entera. Se asigna con objeto.atributo = valor, y cada objeto guarda el suyo por separado.

Python
class Perro:
    pass

rex = Perro()
rex.edad = 3

firulais = Perro()
firulais.edad = 7

print(rex.edad)
print(firulais.edad)
✍️ Tu turno: escribe el código y ejecútalo
🔬 Probalo vos mismo: cada objeto guarda su propio estado

Cambiá los números de abajo. Son dos objetos Perro distintos, cada uno con su propio edad —modificar uno nunca toca al otro:

Si rex.edad vale años y firulais.edad vale años, entonces firulais le lleva 4 años a rex, y en total entre los dos suman 10 años de perro.

Esto ya funciona, pero escribir rex.edad = 3 a mano después de crear cada objeto es repetitivo y fácil de olvidar. El próximo nodo resuelve exactamente ese problema.

4 · __init__ y self

El método __init__ (dos guiones bajos a cada lado) se ejecuta automáticamente apenas creás un objeto, y sirve para inicializar sus atributos de una sola vez. Su primer parámetro siempre es self: una referencia a "este objeto en particular" que Python pasa solo, sin que vos lo escribas al llamar.

Python
class Perro:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

rex = Perro("Rex", 3)
firulais = Perro("Firulais", 7)

print(rex.nombre, rex.edad)
print(firulais.nombre, firulais.edad)
✍️ Tu turno: escribe el código y ejecútalo
self no lo escribís vos al llamar

Perro("Rex", 3) tiene dos argumentos, pero __init__ recibe tres parámetros (self, nombre, edad). Python completa self automáticamente con el objeto recién creado —por eso nunca aparece en la llamada, solo en la definición. Esta misma regla vale para cualquier método de la clase, no solo __init__, como vas a ver en el próximo nodo.

5 · Métodos

Un método es una función definida dentro de una clase, que usa self para leer o modificar los atributos de ese objeto en particular. Se define igual que una función (def), y se llama con objeto.metodo(...) en vez de nombre_funcion(...).

Python
class Perro:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    def ladrar(self):
        print(self.nombre, "dice: ¡Guau!")

    def cumplir_anios(self):
        self.edad = self.edad + 1

rex = Perro("Rex", 3)
rex.ladrar()
rex.cumplir_anios()
print(rex.edad)
✍️ Tu turno: escribe el código y ejecútalo
Atributo vs. método

Un atributo es un dato (self.nombre, un texto); un método es una acción (ladrar(), algo que el objeto hace, definido con def dentro de la clase). cumplir_anios muestra que un método puede leer y modificar un atributo del mismo objeto usando self.

6 · Instancias múltiples

Cerremos el círculo con varios objetos a la vez: cada uno guarda su propio estado (atributos) y responde a los mismos métodos, sin pisarse entre sí.

Python
class Perro:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

    def ladrar(self):
        print(self.nombre, "dice: ¡Guau!")

    def cumplir_anios(self):
        self.edad = self.edad + 1

perros = [Perro("Rex", 3), Perro("Firulais", 7), Perro("Toby", 1)]

for perro in perros:
    perro.ladrar()
    perro.cumplir_anios()
    print(perro.nombre, "ahora tiene", perro.edad, "años")
✍️ Tu turno: escribe el código y ejecútalo
Selección múltiple

¿Cuál de estas frases describe mejor la relación entre Perro (la clase) y rex (creado con Perro())?

Selección múltiple

En la clase Perro, self.nombre es un atributo y ladrar(self) es un método. ¿Qué distingue a ambos?

7 · Repaso rápido

Repasemos los seis conceptos del mapa, todos en un mismo ejemplo:

ConceptoEn este ejemplo
Claseclass Perro: — el molde
Objetorex = Perro("Rex", 3) — una instancia concreta
Atributoself.nombre, self.edad — datos propios de cada objeto
Constructor__init__(self, nombre, edad) — se ejecuta al crear el objeto
selfreferencia a "este objeto"; Python lo pasa solo
Métodoladrar(self) — una acción del objeto
La idea central

Antes tenías datos (variables) y comportamiento (funciones) por separado. Una clase los junta: cada objeto que crees lleva consigo sus propios datos, y sabe qué hacer con ellos. Esa combinación —estado propio + comportamiento propio— es la base de todo lo que viene después en Programación Orientada a Objetos.

Cuando te sientas listo, cerrá este mapa y bajá al Reto Final para poner todo junto.

Reto Final

Antes de escribir una clase de cero, ordená esta: alguien mezcló las líneas de una clase Auto.

Ordená el código

Usá las flechas ↑ ↓ de cada bloque hasta dejar la clase en el orden correcto, y después presioná "Verificar orden".

  1. self.marca = marca
  2. class Auto:
  3. def arrancar(self):
  4. def __init__(self, marca, modelo):
  5. self.modelo = modelo
  6. print(self.marca, "está arrancando")

Ahora escribí una clase parecida, de cero:

Clase Persona
  • __init__(self, nombre, edad) que guarde ambos como atributos.
  • Un método saludar(self) que imprima "Hola, soy " + self.nombre.
  • Un método cumplir_anios(self) que le sume 1 a self.edad.
  • Creá un objeto y probá los dos métodos, imprimiendo la edad antes y después.
🏆 Resuelve aquí el reto

Cheat Sheet

UsoEjemplo
Definir una claseclass Nombre: ...
Crear un objetoobjeto = Nombre(argumentos)
Constructordef __init__(self, ...): ...
Guardar un atributoself.atributo = valor
Leer un atributoobjeto.atributo
Definir un métododef nombre_metodo(self, ...): ...
Llamar un métodoobjeto.nombre_metodo(argumentos)
selfPrimer parámetro de todo método; Python lo pasa solo

¿Sabías que...?

🏛️ De dónde viene la idea

Los conceptos de "clase" y "objeto" nacieron en Simula 67, un lenguaje noruego pensado para simulaciones, décadas antes de que la Programación Orientada a Objetos se volviera popular.

🧬 En Python, todo es un objeto

Un número, un texto o una lista también son instancias de una clase (int, str, list), aunque nunca hayas escrito class para usarlos.

🔒 Atributos "privados" (más adelante)

Anteponer _ o __ al nombre de un atributo es una convención para señalar "no lo toques desde afuera" —el tema de encapsulación de una guía futura.