He estado programando en Python durante aproximadamente dos años; principalmente datos (pandas, mpl, numpy), pero también scripts de automatización y pequeñas aplicaciones web. Estoy tratando de ser un mejor programador y aumentar mi conocimiento de Python y una de las cosas que me molesta es que nunca he usado una clase (aparte de copiar código de matraz aleatorio para pequeñas aplicaciones web). Generalmente entiendo lo que son, pero parece que no puedo entender por qué los necesitaría para una función simple.
Para agregar especificidad a mi pregunta: escribo toneladas de informes automatizados que siempre implican extraer datos de múltiples fuentes de datos (mongo, sql, postgres, apis), realizar un gran o pequeño mung de datos y formateo, escribir los datos en csv / excel / html, envíalo en un correo electrónico. Los scripts van desde ~ 250 líneas hasta ~ 600 líneas. ¿Habría alguna razón para que yo use las clases para hacer esto y por qué?
Respuestas:
Las clases son el pilar de la programación orientada a objetos . OOP está muy preocupado con la organización del código, la reutilización y la encapsulación.
Primero, un descargo de responsabilidad: OOP está parcialmente en contraste con la programación funcional , que es un paradigma diferente que se usa mucho en Python. No todos los que programan en Python (o seguramente la mayoría de los idiomas) usan OOP. Puede hacer mucho en Java 8 que no está muy orientado a objetos. Si no quieres usar OOP, entonces no lo hagas. Si solo está escribiendo scripts únicos para procesar datos que nunca volverá a usar, entonces siga escribiendo como está.
Sin embargo, hay muchas razones para usar OOP.
Algunas razones:
Organización: OOP define formas bien conocidas y estándar de describir y definir datos y procedimientos en código. Tanto los datos como el procedimiento pueden almacenarse en diferentes niveles de definición (en diferentes clases), y existen formas estándar de hablar sobre estas definiciones. Es decir, si usa OOP de manera estándar, le ayudará a usted mismo y a otros a comprender, editar y usar su código. Además, en lugar de utilizar un mecanismo de almacenamiento de datos complejo y arbitrario (dictados de dictados o listas o dictados o listas de dictados de conjuntos, o lo que sea), puede nombrar piezas de estructuras de datos y consultarlas convenientemente.
Estado: OOP lo ayuda a definir y realizar un seguimiento del estado. Por ejemplo, en un ejemplo clásico, si está creando un programa que procesa estudiantes (por ejemplo, un programa de calificaciones), puede mantener toda la información que necesita sobre ellos en un solo lugar (nombre, edad, sexo, nivel de grado, cursos, calificaciones, maestros, compañeros, dieta, necesidades especiales, etc.), y estos datos se conservan mientras el objeto esté vivo y sea fácilmente accesible.
Encapsulación : con la encapsulación, el procedimiento y los datos se almacenan juntos. Los métodos (un término OOP para funciones) se definen junto con los datos sobre los que operan y producen. En un lenguaje como Java que permite el control de acceso , o en Python, dependiendo de cómo describa su API pública, esto significa que los métodos y los datos se pueden ocultar al usuario. Lo que esto significa es que si necesita o desea cambiar el código, puede hacer lo que quiera para la implementación del código, pero mantener las API públicas igual.
Herencia : la herencia le permite definir datos y procedimientos en un lugar (en una clase), y luego anular o ampliar esa funcionalidad más adelante. Por ejemplo, en Python, a menudo veo personas creando subclases de la
dict
clase para agregar funcionalidades adicionales. Un cambio común es anular el método que arroja una excepción cuando se solicita una clave de un diccionario que no existe para dar un valor predeterminado basado en una clave desconocida. Esto le permite extender su propio código ahora o más tarde, permitir que otros extiendan su código y le permite extender el código de otras personas.Reutilización: todas estas razones y otras permiten una mayor reutilización del código. El código orientado a objetos le permite escribir código sólido (probado) una vez y luego reutilizarlo una y otra vez. Si necesita modificar algo para su caso de uso específico, puede heredar de una clase existente y sobrescribir el comportamiento existente. Si necesita cambiar algo, puede cambiarlo todo mientras mantiene las firmas de métodos públicos existentes, y nadie es más sabio (con suerte).
Nuevamente, hay varias razones para no usar OOP, y no es necesario. Pero afortunadamente con un lenguaje como Python, puede usar solo un poco o mucho, depende de usted.
Un ejemplo del caso de uso del estudiante (no hay garantía en la calidad del código, solo un ejemplo):
Orientado a objetos
Dict estándar
fuente
Siempre que necesite mantener un estado de sus funciones y no se pueda lograr con generadores (funciones que rinden en lugar de regresar). Los generadores mantienen su propio estado.
Si desea anular cualquiera de los operadores estándar , necesita una clase.
Siempre que use un patrón de visitante, necesitará clases. Cualquier otro patrón de diseño se puede lograr de manera más efectiva y limpia con generadores, gestores de contexto (que también se implementan mejor como generadores que como clases) y tipos de POD (diccionarios, listas y tuplas, etc.).
Si desea escribir código "pitónico", debe preferir administradores de contexto y generadores sobre las clases. Estará más limpio.
Si desea ampliar la funcionalidad, casi siempre podrá lograrlo con contención en lugar de herencia.
Como todas las reglas, esto tiene una excepción. Si desea encapsular la funcionalidad rápidamente (es decir, escribir código de prueba en lugar de código reutilizable a nivel de biblioteca), puede encapsular el estado en una clase. Será simple y no necesitará ser reutilizable.
Si necesita un destructor de estilo C ++ (RIIA), definitivamente NO desea usar clases. Quieres administradores de contexto.
fuente
Generator
instancia (un iterador especial), mientras que los cierres pueden tener cualquier firma. Básicamente, puede evitar las clases la mayor parte del tiempo creando cierres. Y los cierres no son meramente "funciones definidas en el contexto de otras funciones".Creo que lo haces bien. Las clases son razonables cuando necesita simular alguna lógica de negocios o procesos difíciles de la vida real con relaciones difíciles. Como ejemplo:
También te sugiero que veas este video clásico
fuente
Una clase define una entidad del mundo real. Si está trabajando en algo que existe individualmente y tiene su propia lógica que es independiente de los demás, debe crear una clase para ello. Por ejemplo, una clase que encapsula la conectividad de la base de datos.
Si este no es el caso, no es necesario crear clase
fuente
Depende de su idea y diseño. Si usted es un buen diseñador, los OOP saldrán naturalmente en forma de varios patrones de diseño. Para un procesamiento de nivel de script simple, los OOP pueden ser generales. Simplemente considere los beneficios básicos de los POO como reutilizables y extensibles y asegúrese de que sean necesarios o no. Las OOP hacen que las cosas complejas sean más simples y complejas. Simplemente mantiene las cosas simples de cualquier manera usando OOP o no usando OOP. cualquiera que sea más simple usar eso.
fuente