¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Clases y objetos en Python

Después de esta lección: Puedo modelar una cosa como una clase con estado y comportamiento.

Lección de 60 min4 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

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

PalabraQué significaEjemplo
Claseel molde que describe cómo son y qué hacen unos objetos
Objetouna pieza creada con una clase, con sus propios datos
Atributoun dato que guarda el objetoself.saldo
Métodouna función que pertenece a una clase
Constructorel método que prepara un objeto nuevo__init__
selfel 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

DatoMonedero de AnaMonedero de Luis
titularAnaLuis
saldo al crearlo20 €5 €
después de recargar 10 € a Ana30 €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

Código: python
# 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

Comando
mkdir -p ~/oop && cd ~/oop

Se 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

Comando
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.py

Se 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

Comando
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

Comando
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.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.