Clases y objetos

 La POO permite organizar el código en entidades que representan cosas del mundo real: alumnos, productos, vehículos, usuarios, etc.

1. ¿Qué es una clase?

Una clase es un molde o plantilla que define:

  • Atributos (datos)

  • Métodos (funciones que actúan sobre esos datos)

class Persona:
    pass

2. ¿Qué es un objeto?

Un objeto es una instancia de una clase. Si la clase es el molde, el objeto es el producto final.

p = Persona()

3. Constructor: __init__

El método __init__ se ejecuta automáticamente al crear un objeto.

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

p = Persona("Ana", 22)
print(p.nombre, p.edad)

4. Métodos de instancia

Son funciones dentro de la clase que usan self.

class Persona:
    def __init__(self, nombre):
        self.nombre = nombre

    def saludar(self):
        return f"Hola, soy {self.nombre}"

p = Persona("Carlos")
print(p.saludar())

5. Atributos públicos y privados (convención)

Python no tiene privacidad estricta, pero se usa:

  • _atributo → protegido

  • __atributo → privado (name mangling)

class Cuenta:
    def __init__(self, saldo):
        self.__saldo = saldo  # privado

    def ver_saldo(self):
        return self.__saldo

6. Representación del objeto: __str__

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

    def __str__(self):
        return f"{self.nombre} ({self.edad} años)"

p = Persona("Lucía", 30)
print(p)

ACTIVIDAD PRÁCTICA: “Sistema básico de gestión de alumnos”

Objetivo: que tus alumnos creen clases útiles y entiendan cómo instanciar objetos y trabajar con ellos.

Enunciado

Crea una clase Alumno con:

  • nombre

  • edad

  • curso

  • notas (lista)

Debe incluir:

  1. Un constructor que inicialice los atributos.

  2. Un método añadir_nota(nota) que agregue una nota.

  3. Un método media() que calcule la media del alumno.

  4. Un método __str__() que muestre la información del alumno.

Después:

  • Crea 3 alumnos.

  • Añade varias notas a cada uno.

  • Muestra su información y su media.

Solución propuesta

class Alumno:
    def __init__(self, nombre, edad, curso):
        self.nombre = nombre
        self.edad = edad
        self.curso = curso
        self.notas = []

    def añadir_nota(self, nota):
        self.notas.append(nota)

    def media(self):
        if not self.notas:
            return 0
        return sum(self.notas) / len(self.notas)

    def __str__(self):
        return f"{self.nombre} ({self.edad} años) - Curso: {self.curso}"
    

# Crear alumnos
a1 = Alumno("Ana", 17, "1º DAM")
a2 = Alumno("Luis", 18, "2º ASIR")
a3 = Alumno("Marta", 16, "1º DAW")

# Añadir notas
a1.añadir_nota(8)
a1.añadir_nota(7)

a2.añadir_nota(9)
a2.añadir_nota(6)
a2.añadir_nota(7)

a3.añadir_nota(5)
a3.añadir_nota(6)

# Mostrar información
alumnos = [a1, a2, a3]

for alumno in alumnos:
    print(alumno)
    print("Notas:", alumno.notas)
    print("Media:", alumno.media())
    print()

Ejemplo de salida

Ana (17 años) - Curso: 1º DAM
Notas: [8, 7]
Media: 7.5

Luis (18 años) - Curso: 2º ASIR
Notas: [9, 6, 7]
Media: 7.33

Marta (16 años) - Curso: 1º DAW
Notas: [5, 6]
Media: 5.5