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.
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
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.
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
| Instancia | titulo |
|---|---|
libro_a | Python desde cero |
libro_b | Datos 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.
Python paso a paso Datos con Python
La salida aparecerá aquí.
Necesito una pista
- Dentro de
__init__, guarda el parámetro recibido enself.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.
selfapunta al objeto concreto que está usando el método.
Si puedes crear dos libros con títulos diferentes y explicar por qué no se pisan, ya puedes pasar a métodos y properties.