Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Python desde cero - enfoque científico, Unidad 9 — Introducción a objetos (sin profundizar), 9.2 — Clases básicas ·

Cuándo usar clases

Cuándo usar clases

Introducción

En la programación científica, las clases son una herramienta poderosa para organizar y reutilizar código. Aunque no es necesario usarlas desde cero en Python, entender cuándo y cómo utilizarlas puede ser crucial para manejar proyectos más complejos de manera eficiente y modular. En esta unidad, exploraremos los casos en que es beneficioso implementar clases y proporcionaremos algunos ejemplos prácticos.

Explicación principal con ejemplos

Las clases en Python son un marco orientado a objetos (OO) que permiten definir nuevas estructuras de datos, así como comportamientos asociados. En términos simples, una clase es un molde o plantilla desde la cual se crean instancias (objetos).

Ejemplo: Creación y uso de una clase

Supongamos que estamos trabajando con una base de datos de productos en una empresa de comercio electrónico. Queremos representar cada producto con sus características, como nombre, precio, y stock disponible.

class Producto:
    def __init__(self, nombre, precio, stock):
        self.nombre = nombre
        self.precio = precio
        self.stock = stock

    def vender(self, cantidad):
        if cantidad <= self.stock:
            self.stock -= cantidad
            print(f"Se vendieron {cantidad} unidades de '{self.nombre}'")
        else:
            print("No hay suficiente stock para completar la venta.")

# Creación y uso de una instancia de Producto
producto1 = Producto("Monitor LED", 250.0, 100)
print(producto1.nombre)  # Output: Monitor LED
print(producto1.precio)  # Output: 250.0

# Vender unidades del producto
producto1.vender(30)    # Output: Se vendieron 30 unidades de 'Monitor LED'

Ejemplo: Herencia y Polimorfismo

Supongamos que queremos extender nuestra clase Producto para crear subclases como Electronico e Impresora, que añaden más características específicas.

class Electronico(Producto):
    def __init__(self, nombre, precio, stock, marca):
        super().__init__(nombre, precio, stock)
        self.marca = marca

    def detalles(self):
        print(f"Electrónico: {self.nombre} - Marca: {self.marca}")

class Impresora(Electronico):
    def __init__(self, nombre, precio, stock, marca, tipo_impresion):
        super().__init__(nombre, precio, stock, marca)
        self.tipo_impresion = tipo_impresion

# Creación de un objeto de la subclase Impresora
impresora1 = Impresora("Impresora Laser", 350.0, 20, "HP", "Laser")
impresora1.detalles()  # Output: Electrónico: Impresora Laser - Marca: HP

Errores típicos / trampas

A medida que empiezas a trabajar con clases en Python, puedes enfrentarte a varios problemas comunes:

Trampa 1: Herencia directa innecesaria

Evita heredar de object si no es necesario. En Python 3, todas las clases heredan implicitamente de object, así que no es necesariamente útil declarar una clase como sigue:

class MiClase(object): ...

Trampa 2: No usar el constructor __init__ adecuadamente

Asegúrate de llamar al método __init__ del padre con super() en caso de herencia. Si no lo haces, podrías omitir la inicialización de algunos atributos.

class MiClase:
    def __init__(self):
        self.atributo = "valor"

# No hacer esto (error)
class Subclase(MiClase):
    def __init__(self):
        pass

# Esto es correcto
class Subclase(MiClase):
    def __init__(self):
        super().__init__()

Trampa 3: Asignar valores inmutables incorrectamente

Recuerda que algunos tipos de datos, como las tuplas, son inmutables. Si intentas cambiar un atributo inmutable dentro de una clase, obtendrás un error.

class MiClase:
    def __init__(self):
        self.atributo = (1, 2)

# Error: no se puede modificar una tupla
mi_objeto = MiClase()
mi_objeto.atributo[0] = 3

Trampa 4: Ignorar los métodos mágicos

Python tiene un conjunto de métodos especiales (métodos mágicos) que tienen significado especial. Por ejemplo, __str__ y __repr__ son utilizados para proporcionar representaciones en cadena de objetos.

class MiClase:
    def __init__(self):
        self.atributo = "valor"

    def __str__(self):
        return f"Objeto {self.atributo}"

mi_objeto = MiClase()
print(mi_objeto)  # Output: Objeto valor

Checklist accionable

  1. Revisa si es necesario usar clases: Piensa en cómo organizarías el código sin ellas.
  2. Define la estructura de datos y comportamiento: Identifica los atributos y métodos que necesitarás.
  3. Usa herencia cuando sea apropiado: Evita heredar innecesariamente de object.
  4. Inicializa correctamente en el constructor: Asegúrate de llamar a super().__init__() si estás heredando.
  5. Maneja inmutabilidad adecuadamente: Si necesitas mutabilidad, considera usar listas o diccionarios.
  6. Utiliza métodos mágicos donde sea apropiado: Asegúrate de implementar __str__ y otros para una mejor representación de objetos.

Siguientes pasos

  • Repasa la documentación oficial de Python para obtener más detalles sobre clases y herencia.
  • Practica con problemas reales: Aplica lo aprendido en proyectos prácticos, como gestionar datos en una base de productos o usuarios.
  • Estudia librerías científicas avanzadas: Una vez que comprendas la programación orientada a objetos (OOP), puedes explorar cómo estas técnicas se integran en bibliotecas como NumPy y Pandas.

Siguiendo estos pasos, podrás aprovechar completamente las capacidades de Python para organizar tu código de manera eficiente y modular.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).