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.
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.
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)"
class NombreClase:— define la clase. PascalCase por convención.__init__(self, ...)— el constructor. Se ejecuta automáticamente al crear un objeto. Recibe los datos iniciales y los guarda como atributos.self— referencia al objeto actual. SIEMPRE es el primer parámetro de todo método. Permite acceder a los atributos del objeto.self.atributo = valor— crea un atributo de instancia (cada objeto tiene su propia copia).
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
dataclass
o un diccionario.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.
Ejemplos explicados paso a paso
Ejemplo 1: Clase CuentaBancaria
Hacé clic en ▶ Ejecutar
Ejemplo 2: Clase Cliente con métodos de negocio
Hacé clic en ▶ Ejecutar
Ejemplo 3: Herencia — ClientePremium
Hacé clic en ▶ Ejecutar
Ejemplo 4: dataclass — clases de datos rápidas
Hacé clic en ▶ Ejecutar
Ejemplo 5: Clase Cartera — colección de cuentas
Hacé clic en ▶ Ejecutar
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 |
Ejercicios
Ejercicio 1: Clase Producto
Creá una clase Producto con nombre y precio. Instanciá un producto e imprimilo. Debe
incluir Notebook.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Ejercicio 3: Clase CuentaSimple
Creá CuentaSimple con titular y saldo. Métodos depositar() y
extraer(). Debe incluir 120000.
Hacé clic en ▶ Ejecutar
Ejercicio 4: Lista de objetos
Creá 4 instancias de Cliente(nombre, score), guardalas en lista, filtrá premium
(score>=700) e imprimí. Debe incluir Premium.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Herencia básica
Creá CuentaAhorro(Cuenta) que herede de una Cuenta base y agregue método
aplicar_interes(tasa). Debe incluir 103000.
Hacé clic en ▶ Ejecutar
Ejercicio 6: dataclass
Creá un @dataclass Cotizacion con ticker, precio, variacion. Creá 3 instancias e imprimí
la de mayor precio. Debe incluir YPF.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Ejercicio 8: __len__ y __str__ custom
Creá clase Cartera que guarde cuentas en una lista. Implementá __len__ y
__str__. Debe incluir 3 cuentas.
Hacé clic en ▶ Ejecutar
Ejercicio 9: @property para campos calculados
Creá Empleado con nombre, sueldo_bruto y un @property sueldo_neto que
descuente 31%. Debe incluir neto.
Hacé clic en ▶ Ejecutar
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.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Una clase es un molde (
class), un objeto es una instancia con datos reales. __init__inicializa atributos.selfreferencia al objeto actual.__str__define cómo se muestra conprint().__len__paralen().- Herencia (
class Hija(Padre)) permite reutilizar y extender.super()llama al padre. @dataclassgenera constructores y repr automáticos para clases de datos.- Usá clases cuando tenés objetos con estado + comportamiento. Funciones para lógica pura.
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