2009-11-26 13 views
37

Vengo de un entorno en el que normalmente creo un archivo por clase. Organizo clases comunes bajo directorios también. Esta práctica es intuitiva para mí y ha demostrado ser efectiva en C++, PHP, JavaSript, etc.La manera Pythonic de organizar módulos y paquetes

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 una clase automobile.py y Automobile, me parece tonto siempre referirme a ella como automobile.Automobile.

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

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

+0

Duplicado: http://stackoverflow.com/questions/1642975/folder-and-file-organization-for-python-development –

+1

Duplicado: http://stackoverflow.com/questions/106896/how-many-python -classes-should-i-put-in-one-file –

Respuesta

31

Piense en términos de una "unidad lógica de empaquetado", que puede ser una única clase, pero más a menudo será un conjunto de clases que cooperen estrechamente. Las clases (o funciones de nivel de módulo: "no hacer Java en Python" utilizando siempre métodos estáticos cuando las funciones de nivel de módulo también están disponibles como opción) -) se pueden agrupar 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 y no el otro, entonces probablemente deberían estar en módulos distintos (tal vez en el mismo paquete, es decir, 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) prácticas razonablemente buenas, por lo que puede aprender principalmente de ella con el ejemplo. Por ejemplo, el módulo threading por supuesto define una clase Thread ... pero también contiene las clases de primitiva de sincronización como bloqueos, eventos, condiciones y semáforos, y una clase de excepción que se puede generar mediante operaciones de subprocesamiento (y algunas más cosas).Está en el límite superior de tamaño razonable (800 líneas incluyendo espacios en blanco y cadenas de documentos), y algunas funcionalidades cruciales relacionadas con hilos tales como Queue se han colocado en un módulo separado, sin embargo es un buen ejemplo de qué cantidad máxima de funcionalidad todavía tiene sentido empacar en un solo módulo.

7

Si usted quiere meter a su sistema de una sola clase por archivo (que es lógica, no me malinterpreten), es posible hacer algo como esto para evitar tener que referirse a automobile.Automobile:

from automobile import Automobile 
car = Automobile() 

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

4

En un proyecto de tamaño medio, 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 único 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 ese camino 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 parecer demasiado grande, divídelo.

8

Si vienes desde un punto de vista C++, podrías 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 funcionalidades específicas.

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

Cuestiones relacionadas