Lección 29 de 45 · Módulos y orientación a objetos

Clases y objetos

Agrupa datos que pertenecen a una misma entidad y crea varias instancias sin confundir la plantilla con los objetos concretos.

Modelar entidadesEstado por instanciaInstancias y self
Índice · Lección 29/45
Una clase empieza a tener sentido cuando varios datos describen la misma cosa

Podrías representar un libro con un diccionario: título, autor, páginas. Si después necesitas muchos libros con la misma estructura y operaciones propias, una clase puede reunir ese modelo en un solo lugar.

No pienses todavía en «programación orientada a objetos» como una teoría enorme. Aquí solo vas a aprender a crear un tipo propio y fabricar objetos independientes.

Evidencia de aprendizaje

Mantener mentalmente dos instancias a la vez y predecir qué atributo cambia en cada una.

La clase es el molde; cada instancia guarda su propio estado

Dos objetos creados con la misma clase
class Libro:
    def __init__(self, titulo):
        self.titulo = titulo

uno = Libro("Python fácil")
dos = Libro("Automatiza tareas")

print(uno.titulo)
print(dos.titulo)

Libro es la definición. uno y dos son instancias diferentes. Ambas tienen un atributo llamado titulo, pero almacenan valores distintos.

__init__ recibe los datos necesarios para dejar listo un objeto nuevo

Cuando escribes Libro("Python fácil"), Python crea la instancia y llama a __init__. Los parámetros permiten decidir qué datos necesita un libro al nacer.

Inicializar más de un atributo
class Libro:
    def __init__(self, titulo, paginas):
        self.titulo = titulo
        self.paginas = paginas

libro = Libro("Python fácil", 180)
print(libro.paginas)

El objetivo de este método no es hacer todo el trabajo imaginable, sino dejar un estado inicial coherente.

self significa «esta instancia concreta»

Dentro de la clase, self.titulo no es una variable local cualquiera. Es el atributo titulo del objeto con el que estás trabajando.

Cuando ejecutas uno.titulo, accedes al dato de uno. Cuando ejecutas dos.titulo, accedes al de dos. self permite que el mismo código funcione para cada instancia sin mezclar sus estados.

No conviertas cada conjunto de datos en una clase por reflejo

Un diccionario puede ser suficiente para una estructura simple que solo transporta información. Una clase empieza a aportar más valor cuando quieres que varias instancias compartan reglas u operaciones relacionadas con esos datos.

La siguiente lección añadirá precisamente ese comportamiento mediante métodos.

Dos instancias, dos estados independientes

Instanciatitulo
libro_aPython desde cero
libro_bDatos con Python

Modificar libro_a.titulo no debería cambiar libro_b.titulo. self indica qué instancia concreta está recibiendo o modificando el atributo.

Corrige el constructor y después cambia solo el título del primer objeto. La segunda instancia debe conservar el suyo.

Salida esperada
Python paso a paso
Datos con Python
objetos.py
La salida aparecerá aquí.

Necesito una pista
  • Dentro de __init__, guarda el parámetro recibido en self.titulo.
Ver una solución razonada
class Libro:
    def __init__(self, titulo):
        self.titulo = titulo

libro_a = Libro("Python desde cero")
libro_b = Libro("Datos con Python")
libro_a.titulo = "Python paso a paso"

print(libro_a.titulo)
print(libro_b.titulo)

El fallo silencioso: guardar el dato en una variable local

Si dentro de __init__ escribes titulo_guardado = titulo, esa variable desaparece al terminar el método. Si el dato debe formar parte del objeto, necesita vivir en self.

Pregunta: «¿quiero poder consultar este valor después mediante objeto.algo?». Si la respuesta es sí, normalmente estás pensando en un atributo.

Has entendido una clase cuando puedes imaginar dos instancias a la vez

  • La clase describe la estructura común.
  • Cada instancia conserva sus propios atributos.
  • self apunta al objeto concreto que está usando el método.
Preparado para añadir comportamiento

Si puedes crear dos libros con títulos diferentes y explicar por qué no se pisan, ya puedes pasar a métodos y properties.