QuieroProgramar por Rodri Gonzalez
Python · Lección 26 de 27

Clases y objetos (intro)

La Programación Orientada a Objetos (OOP) te permite modelar conceptos del mundo real (clientes, cuentas, transacciones) como objetos con datos y comportamiento. Es el paradigma que usan pandas, scikit-learn y prácticamente todas las librerías de Python.

90–120 min Prerrequisitos: 18-19 Funciones, 25 Excepciones
01

Concepto teórico

¿Qué es una clase?

Una clase es un molde (template) para crear objetos. Define qué datos tiene (atributos) y qué puede hacer (métodos). Un objeto es una instancia concreta de esa clase — un caso particular con datos reales.

Analogía bancaria: la clase CuentaBancaria es el formulario de apertura de cuenta (el molde). Define que toda cuenta tiene titular, CBU, saldo y tipo. Un objeto es la cuenta real de García con su CBU específico y su saldo de $150,000. Del mismo molde podés crear miles de cuentas, cada una con datos distintos.

Sintaxis: class, __init__, self

class Cliente:
    def __init__(self, nombre, score, saldo=0):
        self.nombre = nombre    # atributo de instancia
        self.score = score
        self.saldo = saldo
    
    def es_premium(self):       # método
        return self.score >= 700
    
    def __str__(self):          # representación como string
        return f"Cliente({self.nombre}, score={self.score})"

# Crear instancias (objetos)
c1 = Cliente("García", 720, 150000)
c2 = Cliente("López", 680)
print(c1.nombre)        # "García"
print(c1.es_premium())  # True
print(c1)               # "Cliente(García, score=720)"
¿Por qué self? Porque cuando llamás c1.es_premium(), Python internamente lo traduce a Cliente.es_premium(c1). self es el objeto sobre el que estás operando. Sin self, el método no sabría a qué cuenta referirse.

Métodos especiales (dunder methods)

Python tiene métodos "mágicos" que empiezan y terminan con doble guión bajo (__):

Método Cuándo se llama Ejemplo
__init__ Al crear el objeto Cliente("García", 720)
__str__ print(obj) o str(obj) print(c1)
__repr__ Representación técnica En el REPL o en listas
__len__ len(obj) len(mi_cartera)
__eq__ obj1 == obj2 Comparar igualdad

Herencia básica

La herencia permite crear una clase nueva basada en otra existente. La clase hija hereda todos los atributos y métodos de la padre y puede agregar o sobreescribir funcionalidad:

class ClientePremium(Cliente):  # hereda de Cliente
    def __init__(self, nombre, score, saldo, beneficio):
        super().__init__(nombre, score, saldo)  # llamar al padre
        self.beneficio = beneficio
    
    def tasa_preferencial(self):  # método nuevo
        return 0.035

dataclass — clases de datos rápidas

Desde Python 3.7, @dataclass genera automáticamente __init__, __repr__, __eq__ y más. Ideal para clases que son básicamente "contenedores de datos":

from dataclasses import dataclass

@dataclass
class Transaccion:
    tipo: str
    monto: float
    cuenta: str
    fecha: str = "2025-01-01"  # default
¿Cuándo clases vs funciones? Usá funciones cuando tenés lógica que recibe datos y devuelve resultados. Usá clases cuando tenés un "objeto" con estado (datos que cambian) y comportamiento (métodos). Si solo necesitás agrupar datos sin comportamiento, usá dataclass o un diccionario.
En librerías de Python: un DataFrame de pandas es un objeto de la clase pd.DataFrame. .head(), .describe(), .groupby() son métodos. .shape, .columns son atributos. Un modelo de scikit-learn (RandomForestClassifier()) es un objeto con métodos .fit() y .predict(). Entender OOP te permite usar estas librerías con confianza.
02

Ejemplos explicados paso a paso

Ejemplo 1: Clase CuentaBancaria

ejemplo_01_cuenta.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 2: Clase Cliente con métodos de negocio

ejemplo_02_cliente.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 3: Herencia — ClientePremium

ejemplo_03_herencia.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 4: dataclass — clases de datos rápidas

ejemplo_04_dataclass.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 5: Clase Cartera — colección de cuentas

ejemplo_05_cartera.pyPython

                
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Concepto Sintaxis Significado
Definir clase class MiClase: PascalCase por convención
Constructor def __init__(self, ...): Inicializa atributos
Atributo self.nombre = valor Dato de cada instancia
Método def metodo(self, ...): Función del objeto
Instanciar obj = MiClase(args) Crear un objeto
Herencia class Hija(Padre): Hija hereda de Padre
super() super().__init__(...) Llamar al padre
__str__ def __str__(self): Para print(obj)
__len__ def __len__(self): Para len(obj)
@dataclass @dataclass class X: Auto-genera __init__/__repr__/__eq__
@property @property def x(self): Atributo calculado
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Clase Producto

Creá una clase Producto con nombre y precio. Instanciá un producto e imprimilo. Debe incluir Notebook.

ejercicio_01.pyDebe incluir "Notebook"

                    
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Método y __str__

Agregá un método con_iva() que devuelva precio*1.21, y __str__ que muestre nombre y precio. Debe incluir 1113200.

ejercicio_02.pyDebe incluir "1113200"

                    
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Clase CuentaSimple

Creá CuentaSimple con titular y saldo. Métodos depositar() y extraer(). Debe incluir 120000.

ejercicio_03.pyDebe incluir "120000"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Lista de objetos

Creá 4 instancias de Cliente(nombre, score), guardalas en lista, filtrá premium (score>=700) e imprimí. Debe incluir Premium.

ejercicio_04.pyDebe incluir "Premium"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Herencia básica

Creá CuentaAhorro(Cuenta) que herede de una Cuenta base y agregue método aplicar_interes(tasa). Debe incluir 103000.

ejercicio_05.pyDebe incluir "103000"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: dataclass

Creá un @dataclass Cotizacion con ticker, precio, variacion. Creá 3 instancias e imprimí la de mayor precio. Debe incluir YPF.

ejercicio_06.pyDebe incluir "YPF"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Cuenta con validación y excepciones

Agregá validación al extraer(): si el monto > saldo, lanzá ValueError. Probá con try/except. Debe incluir insuficiente.

ejercicio_07.pyDebe incluir "insuficiente"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: __len__ y __str__ custom

Creá clase Cartera que guarde cuentas en una lista. Implementá __len__ y __str__. Debe incluir 3 cuentas.

ejercicio_08.pyDebe incluir "3 cuentas"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: @property para campos calculados

Creá Empleado con nombre, sueldo_bruto y un @property sueldo_neto que descuente 31%. Debe incluir neto.

ejercicio_09.pyDebe incluir "neto"

                    
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Sistema bancario completo con OOP

Creá clases Banco, Cliente y Cuenta. El banco tiene clientes, cada cliente tiene cuentas. Implementá: agregar cliente, abrir cuenta, depositar, y un reporte general. Debe incluir BANCO.

ejercicio_10_desafio.pyDebe incluir "BANCO"

                    
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la última lección (27 · Proyecto integrador) vas a combinar TODO lo aprendido en un proyecto completo de gestión de datos.

Recursos: Python docs — Classes · dataclasses