Pregunta

Vengo de un fondo en el que normalmente creo un archivo por clase. Organizo clases comunes bajo directorios también. Esta práctica es intuitiva para mí y se ha demostrado que es efectiva en C ++, PHP, JavaSript, etc.

Tengo problemas para llevar esta metáfora a Python: los archivos ya no son solo archivos, sino que son módulos formales. No parece correcto tener solo una clase en un módulo: la mayoría de las clases son inútiles por sí mismas. Si tengo un automobile.py y una clase Automobile , parece una tontería referirme siempre a él también como Automobile.Automobile .

Pero, al mismo tiempo, no parece correcto tirar una tonelada de código en un archivo y llamarlo por día. Obviamente, una aplicación muy compleja debe tener más de 5 archivos.

¿Cuál es la forma correcta --- o pitónica ---? (O si no hay una forma correcta, ¿cuál es su forma preferida y por qué?) ¿Cuánto código debo lanzar en un módulo de Python?

¿Fue útil?

Solución

Piense en términos de una " unidad lógica de embalaje " - que puede ser una sola clase, pero más a menudo será un conjunto de clases que cooperan estrechamente. Las clases (o funciones a nivel de módulo - no "haga Java en Python" usando métodos estáticos siempre que las funciones a nivel de módulo también están disponibles como opción!) Pueden agruparse según este criterio. Básicamente, si la mayoría de los usuarios de A también necesitan B y viceversa, A y B probablemente deberían estar en el mismo módulo; pero si muchos usuarios solo necesitarán uno de ellos y no el otro, entonces probablemente deberían estar en distintos módulos (tal vez en el mismo paquete, es decir, en el directorio con un archivo __init__.py ).

La biblioteca estándar de Python, aunque está lejos de ser perfecta, tiende a reflejar (en su mayoría) buenas prácticas, por lo que en su mayoría puedes aprender de ella con el ejemplo. Por ejemplo, el módulo threading por supuesto define una clase Thread ... pero también contiene las clases primitivas de sincronización como bloqueos, eventos, condiciones y semáforos, y un clase-excepción que puede ser provocada por operaciones de subprocesamiento (y algunas cosas más). Está en el límite superior del tamaño razonable (800 líneas, incluyendo espacios en blanco y cadenas de documentos), y algunas funciones cruciales relacionadas con subprocesos, como la Cola, se han colocado en un módulo separado. Sin embargo, es un buen ejemplo de la cantidad máxima de funciones que aún tiene sentido. para empaquetar en un solo módulo.

Otros consejos

Si desea mantener su sistema de una clase por archivo (lo cual es lógico, no me malinterprete), podría hacer algo como esto para evitar tener que referirse al automóvil . Automático :

from automobile import Automobile
car = Automobile()

Sin embargo, como lo menciona cobbal, más de una clase por archivo es bastante común en Python. De cualquier manera, siempre que elijas un sistema sensible y lo utilices de manera consistente, no creo que ningún usuario de Python se enoje contigo :).

Si viene desde un punto de vista de c ++, podría ver módulos de Python similares a .so o .dll. Sí, parecen archivos de origen, porque Python tiene secuencias de comandos, pero en realidad son bibliotecas cargables de funcionalidad específica.

Otra metáfora que puede ayudar es que podría ver los módulos de Python como espacios de nombres.

En un proyecto de tamaño mediano, me encontré con varios conjuntos de clases estrechamente relacionadas. Varios de esos conjuntos ahora están agrupados en archivos; por ejemplo, las clases de red de bajo nivel están todas en un solo módulo network . Sin embargo, algunas de las clases más grandes se han dividido en su propio archivo.

Quizás la mejor manera de comenzar esa ruta desde un historial de una clase por archivo es tomar las clases que normalmente colocaría en el mismo directorio y, en su lugar, mantenerlas en el mismo archivo. Si ese archivo comienza a verse demasiado grande, divídalo.

Como directriz vaga: más de 1 clase por archivo es la norma para python

también, vea ¿Cuántas clases de Python debería? poner en un archivo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top