Programación Orientada a Objetos en Python

Objetivo

Comprender y aplicar los conceptos básicos de la programación orientada a objetos (POO) en Python mediante ejemplos progresivos.

Conceptos clave

Clase
Plantilla para crear objetos.
Objeto
Instancia de una clase.
Atributo
Variable asociada a un objeto.
Método
Función definida dentro de una clase.
Encapsulación
Agrupar datos y comportamientos en una clase.

Esta lección introduce los fundamentos de la POO de forma progresiva. Es importante que el alumno practique creando sus propias clases para consolidar el aprendizaje.

Ejemplo 1 – Clase básica

class Persona:
    def saludar(self):
        print("Hola, soy una persona")

p1 = Persona()
p1.saludar()

Preguntas

  1. ¿Cómo se llama la clase definida?
  2. ¿Qué tipo de elemento es saludar?
  3. ¿Qué hace el método saludar?
  4. ¿Qué significa self?
  5. ¿Qué se crea con p1 = Persona()?
  6. ¿Qué ocurre al ejecutar p1.saludar()?
  7. ¿Cuántos objetos se crean en este código?
  8. ¿Se puede crear otro objeto de la misma clase? ¿Cómo?

Ejemplo 2 – Atributos

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

    def saludar(self):
        print("Hola, soy", self.nombre)

p1 = Persona("Irving")
p1.saludar()

Preguntas

  1. ¿Qué método especial se utiliza para inicializar el objeto?
  2. ¿Qué valor recibe nombre al crear p1?
  3. ¿Dónde se almacena el atributo nombre?
  4. ¿Qué imprime el programa?
  5. ¿Qué pasaría si se crea p2 = Persona("Ana")?
  6. ¿Cuál es la diferencia con el ejemplo anterior?
  7. ¿Qué representa self.nombre?
  8. ¿Se pueden agregar más atributos? ¿Cómo?

Ejemplo 3 – Múltiples atributos y métodos

class Coche:
    def __init__(self, marca, velocidad):
        self.marca = marca
        self.velocidad = velocidad

    def acelerar(self):
        self.velocidad += 10

    def mostrar(self):
        print(self.marca, "va a", self.velocidad, "km/h")

c1 = Coche("Toyota", 50)
c1.acelerar()
c1.mostrar()

Preguntas

  1. ¿Cuántos atributos tiene la clase?
  2. ¿Qué hace el método acelerar?
  3. ¿Qué valor tendrá velocidad después de acelerar?
  4. ¿Qué imprime mostrar?
  5. ¿Qué tipo de dato es velocidad?
  6. ¿Qué ocurre si se llama dos veces a acelerar?
  7. ¿Cómo crearías otro coche diferente?
  8. ¿Qué pasaría si no se llama a acelerar?

Ejemplo 4 – Encapsulación simple

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

    def depositar(self, cantidad):
        self.__saldo += cantidad

    def mostrar_saldo(self):
        print("Saldo:", self.__saldo)

c = Cuenta(1000)
c.depositar(500)
c.mostrar_saldo()

Preguntas

  1. ¿Qué significa que __saldo tenga doble guion bajo?
  2. ¿Se puede acceder directamente a __saldo desde fuera?
  3. ¿Qué hace el método depositar?
  4. ¿Cuál es el saldo final?
  5. ¿Qué método permite ver el saldo?
  6. ¿Qué concepto de POO se aplica aquí?
  7. ¿Qué pasaría si intentas imprimir c.__saldo?
  8. ¿Cómo podrías retirar dinero (nuevo método)?

Ejemplo 5 – Herencia

class Animal:
    def hablar(self):
        print("El animal hace un sonido")

class Perro(Animal):
    def hablar(self):
        print("El perro ladra")

a = Animal()
p = Perro()

a.hablar()
p.hablar()

Preguntas

  1. ¿Qué clase es la clase base?
  2. ¿Qué clase hereda de otra?
  3. ¿Qué significa Perro(Animal)?
  4. ¿Qué hace el método hablar en cada clase?
  5. ¿Qué imprime a.hablar()?
  6. ¿Qué imprime p.hablar()?
  7. ¿Qué concepto se aplica cuando Perro redefine el método?
  8. ¿Se pueden crear más clases que hereden de Animal?

Repaso de conceptos fundamentales de la lección

1. Clase

Una clase es un molde o plantilla.

Sirve para definir cómo serán ciertos objetos: qué datos tendrán y qué acciones podrán realizar.

Por ejemplo:

  • una clase Persona puede tener un nombre,
  • una clase Coche puede tener una marca y una velocidad,
  • una clase Alumno puede tener nombre y calificación.

La clase no es el objeto en sí, sino la estructura que indica cómo construirlo.

Piensa en una clase como el plano de una casa. El plano no es la casa real, pero indica cómo debe construirse.

2. Objeto

Un objeto es una instancia de una clase.

Es decir, cuando ya se crea algo real a partir del molde.

Ejemplo conceptual:

  • La clase es Alumno
  • Un objeto puede ser un alumno específico con nombre "Luis" y calificación 8

Entonces:

  • Alumno es la plantilla
  • "Luis" con calificación 8 es un objeto concreto

3. Método

Un método es una función que pertenece a una clase.

Sirve para definir acciones o comportamientos de los objetos.

Ejemplos de métodos:

  • saludar()
  • acelerar()
  • mostrar()
  • depositar()

Un método trabaja normalmente con los datos del propio objeto.

4. Atributo

Un atributo es una variable asociada a un objeto.

Representa características o información del objeto.

Ejemplos:

  • nombre
  • calificación
  • marca
  • velocidad
  • saldo
  • precio
  • cantidad

Si se tiene una clase Producto, algunos atributos podrían ser:

  • nombre
  • precio
  • cantidad

5. self

self representa al objeto actual.

Se usa dentro de los métodos para acceder a sus propios atributos y métodos.

Por ejemplo, cuando se escribe:

self.nombre

se está diciendo: “usa el atributo nombre del objeto actual”.

Sin self, Python no sabría a qué objeto pertenece ese dato.

self no es una palabra reservada obligatoria por nombre, pero en Python se usa siempre así por convención y claridad.

6. Método __init__

El método __init__ es un método especial que se ejecuta automáticamente cuando se crea un objeto.

Sirve para inicializar los atributos.

Por ejemplo, cuando se crea un alumno, en __init__ se pueden asignar:

  • su nombre,
  • su calificación.

Entonces, al momento de construir el objeto, ya queda con sus datos guardados.

7. Encapsulación

La encapsulación consiste en proteger o controlar el acceso a ciertos atributos.

En Python, una forma básica de indicar que un atributo no debe usarse directamente desde fuera de la clase es escribirlo con doble guion bajo:

__saldo

Esto no significa que sea imposible acceder, sino que Python lo protege de forma básica para fomentar el uso correcto.

La idea es que ciertos datos se modifiquen solo mediante métodos controlados, por ejemplo:

  • depositar dinero,
  • retirar dinero,
  • mostrar saldo.

Así se evita que alguien cambie el saldo arbitrariamente sin reglas.

8. Herencia

La herencia permite crear una clase nueva a partir de otra clase existente.

La nueva clase hereda atributos y métodos de la clase base.

Ejemplo:

  • Animal puede ser la clase general
  • Perro puede heredar de Animal

Esto evita repetir código y permite especializar comportamientos.

9. Sobrescritura de métodos

La sobrescritura ocurre cuando una clase hija redefine un método que ya existía en la clase padre.

Por ejemplo:

  • Animal tiene el método hablar()
  • Perro también tiene hablar(), pero con un comportamiento distinto

Así, cada objeto responde según su propia clase.