Resumen
En este episodio (E63, grabado el 14/11/2023) se introduce la programación orientada a objetos (OOP) en Python y se explica cuándo es útil para quien hace análisis de datos. La conclusión central es que en análisis de datos muchas veces basta el estilo imperativo o funcional. La OOP sirve sobre todo para construir sistemas o herramientas que otros usarán, para comunicarse con desarrolladores y para entender qué hay detrás de las librerías. Con un ejemplo de inventario de ítems (basado en un video de freeCodeCamp) se recorren clases, instancias, atributos de clase e instancia, `__init__`, métodos, `assert`, métodos mágicos, `@classmethod`, `@staticmethod`, herencia y `super`. También se discute el tipado en Python, que se considera una práctica poco confiable porque no se valida. Se deja para otra sesión la privacidad, getters/setters, la creación de decoradores y los principios de OOP. Un comentario recurrente es que en Python todo es un objeto, aunque eso no obliga a programar con OOP.
Capítulos
- 00:00IntroPresentación del episodio 63 sobre programación orientada a objetos en Python y por qué puede servir en análisis de datos.
- 00:15Por qué es útilLa OOP es útil para sistemas con elementos similares que comparten atributos, para herramientas que usarán otros y para entender lo que ocurre por detrás de las librerías. En análisis de datos no siempre es necesaria: se puede usar programación funcional o imperativa, y los lenguajes están migrando a esquemas híbridos. Se comenta que los 10 lenguajes más populares eran casi todos orientados a objetos.
- 08:00Qué es una clase y un objeto o instancia.Se define la clase `Item` con `class` y se crean instancias en distintos espacios de memoria. El `print` por defecto es genérico (nombre de clase y dirección de memoria) porque debe funcionar para cualquier clase.
- 11:57Qué son los atributos y métodosLos atributos son variables internas de la clase (precio, cantidad, nombre) y pueden agregarse también a una instancia por fuera de la definición. Se compara con una lista más genérica; todas las funciones dentro de una clase son métodos.
- 19:24Constructor __init__El constructor se ejecuta siempre que se crea una instancia y permite recibir parámetros (nombre, precio, cantidad con valor por defecto). Con él cada instancia tiene su propio nombre, algo que no se logra con atributos de clase.
- 21:01Diferencia entre atributos de instancia y de clase`self` hace referencia a la instancia específica y `cls` a la clase (ambos son convención). Un atributo de clase como la lista `all` se comparte entre todas las instancias, por lo que modificarlo desde una se refleja en las demás.
- 24:31Creación de un métodos con la información de la instanciaSe crea `calculate_total_price` usando `self.price` y `self.quantity` en vez de pasar parámetros. Se recomienda reiniciar el entorno con frecuencia para evitar estados corruptos y se critica el setting por defecto de RStudio de guardar el ambiente. Hay una larga digresión sobre RStudio, Spyder, Kedro y qué sería "avanzado" en Python (herencia, polimorfismo, patrones de diseño, estructura de proyectos).
- 35:10MemesMeme sobre cambiar un atributo privado a público para una prueba, lo que lleva al encapsulamiento como principio de la OOP. Se mencionan la importancia de planificar el diseño y el refactoring, la comparación OOP vs. programación funcional y una digresión sobre Godot frente a Unity.
- 42:14Assert`assert` permite poner una condición (por ejemplo, precio no negativo) y lanza `AssertionError` con un mensaje si no se cumple. Se compara con `TypeError` y `KeyError`, y se mueven las validaciones dentro del `__init__`, donde además cada instancia se agrega a la lista de clase.
- 43:44Magic methos, como __repr__, __dict__, etc`__repr__` define cómo se imprime la instancia de forma legible. Los métodos mágicos (`__dict__`, `__init__`, etc.) existen por defecto en toda clase; `__dict__` entrega los atributos como diccionario, tanto de la clase como de la instancia.
- 49:12Usos de guiones bajos en nombresUn guion bajo indica atributo protegido, dos indican privado, y dos al inicio y al final marcan métodos mágicos. Es una convención; el detalle se deja para otra sesión.
- 52:47DecoradoresExplicación breve: permiten agregar propiedades a una función ya creada, como se vio con las API (decoradores que configuran la función por detrás). Se muestra que `float` e `int` también son clases, de modo que en Python todo es un objeto.
- 54:05Decorador @classmethodUn método de clase recibe `cls` y se puede llamar sin instancia. Se ejemplifica con `instantiate_from_csv`, que lee un CSV y crea una instancia por fila.
- 58:26Decorador @staticmethodUn método estático no depende de la instancia ni de la clase y se pone dentro de la clase sobre todo por orden. Se ejemplifica con una función que verifica si un número es entero; si se necesitara acceder a un atributo de clase, habría que usar `@classmethod`.
- 01:01:13Usar tipado en python o no?Las anotaciones de tipo en Python son una sugerencia: no generan error si el tipo no coincide. Se las considera mala práctica porque pueden dar información inconsistente; se menciona mypy como herramienta opcional que habría que revisar. Un comentarista nombra el concepto de "tipado explícito" y otro aclara que Python es de tipado dinámico.
- 01:06:53Crear un decoradorSe muestra la sintaxis para definir un decorador propio sin explicarla por falta de tiempo. Los decoradores usados hasta ahora vienen incluidos en Python.
- 01:07:39Herecia y uso de `super`Una clase `Phone` hereda de `Item`; copiar el constructor genera duplicidad de código, que se evita llamando al constructor padre con `super()`. `super` es más genérico que nombrar la clase madre, porque permite insertar clases intermedias sin romper el código.
- 01:13:00Proiordad al llamar atributosAl pedir un atributo, Python busca primero en la instancia y luego sube por los niveles de la jerarquía hasta encontrarlo. Si no lo encuentra, da error.
- 01:14:20Temas complementarios que no cubriremos ahoraQuedan pendientes: principios de OOP, getters/setters, propiedades, métodos privados/públicos/protegidos, decoradores propios y otros temas, que pueden retomarse en otra sesión si hay interés.
- 01:15:42CierreRepaso de contenidos del canal (episodios sobre entrevistas de trabajo y otros videos de la semana), comentarios del chat (Python es de tipado dinámico, idea de un GPT con las transcripciones) y conclusiones finales. Se recuerda que entender OOP ayuda a leer el código de las librerías y a comunicarse con otros. Se hace un raid y se recuerda el horario de martes de 7 a 9 de la noche (hora chilena).
- 01:21:32El fuego dio origen a la IAUn espectador cita una afirmación atribuida a Google de que la IA tendría más impacto que el descubrimiento del fuego. Los presentadores bromean sobre que, considerando todas las ramificaciones, el fuego habría dado origen a la IA.