Una tarjeta con saldo que sabe pagar
Una clase es el molde que usa Python para crear objetos, y cada objeto guarda sus propios datos y sabe hacer cosas con ellos. Sirve para modelar una cosa del mundo real dentro de un programa claro.
Piensa en la tarjeta de la cafetería del campus. Tiene un saldo, se recarga y se paga con ella. Sin clases tendrías un diccionario y funciones sueltas repartidas por todo el programa.
Al final de esta lección
Nota
Puedo modelar una cosa como una clase con estado y comportamiento.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clase | el molde que describe cómo son y qué hacen unos objetos | |
| Objeto | una pieza creada con una clase, con sus propios datos | |
| Atributo | un dato que guarda el objeto | self.saldo |
| Método | una función que pertenece a una clase | |
| Constructor | el método que prepara un objeto nuevo | __init__ |
| self | el propio objeto, dentro de un método |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Clase: el molde. Objeto: la pieza
Una clase describe cómo es una cosa y qué sabe hacer. Un objeto es una cosa concreta hecha con ese molde.
La clase Monedero es el molde. El monedero de Ana y el de Luis son dos objetos. Los dos tienen saldo, pero cada uno guarda el suyo.
Ejemplo: un molde y dos objetos
| Dato | Monedero de Ana | Monedero de Luis |
|---|---|---|
| titular | Ana | Luis |
| saldo al crearlo | 20 € | 5 € |
| después de recargar 10 € a Ana | 30 € | 5 € |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El constructor da el estado inicial
El método __init__ se ejecuta al crear el objeto. Recibe los datos de partida y los guarda en atributos.
Dentro de cada método, self es el objeto con el que se trabaja. Por eso se escribe self.saldo: es el saldo de este monedero y no el de otro.
Los atributos son el estado del objeto. Los métodos son su comportamiento.
Una clase con estado y dos métodos
# La tarjeta de la cafetería del campus.
class Monedero:
def __init__(self, titular, saldo):
self.titular = titular
self.saldo = saldo
def recargar(self, importe):
self.saldo = self.saldo + importe
def pagar(self, importe):
if importe > self.saldo:
return False
self.saldo = self.saldo - importe
return True
ana = Monedero("Ana", 20)
luis = Monedero("Luis", 5)
ana.recargar(10)
print(ana.saldo)
print(luis.pagar(8))
print(luis.saldo)
# Prueba a pagar 5 con el monedero de Luis y mira su saldo.
La clase vive en un archivo
En la terminal del laboratorio guardas la clase en un archivo y la usas desde otro código. Los identificadores van en inglés, como se hace en Python. Los textos y los comentarios, en español.
Crea una carpeta de trabajo, escribe el archivo monedero.py y úsalo dos veces con python3 -c. Verás que cada objeto tiene su propio saldo.
Entra en la carpeta de trabajo
mkdir -p ~/oop && cd ~/oopSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe la clase Monedero en un archivo
printf 'class Monedero:\n def __init__(self, titular, saldo):\n self.titular = titular\n self.saldo = saldo\n\n def recargar(self, importe):\n self.saldo = self.saldo + importe\n\n def pagar(self, importe):\n if importe > self.saldo:\n return False\n self.saldo = self.saldo - importe\n return True\n' > monedero.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea dos objetos y recarga solo uno
python3 -c "from monedero import Monedero; ana = Monedero('Ana', 20); luis = Monedero('Luis', 5); ana.recargar(10); print(ana.saldo, luis.saldo)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Paga más de lo que hay
python3 -c "from monedero import Monedero; m = Monedero('Ana', 20); print(m.pagar(50), m.saldo)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que cambiar un objeto cambia a todos los de su clase. No es así. Cada objeto guarda sus propios atributos. Recargar el monedero de Ana no toca el de Luis. La clase solo dice qué atributos y métodos habrá.
Un método cambia el estado y puede responder
recargar cambia el saldo y no devuelve nada. pagar cambia el saldo solo si alcanza, y devuelve True o False para decir qué ha pasado.
Antes de cambiar el estado, un método puede comprobar una condición. Así el objeto se protege y nunca queda con un saldo negativo.