6

Estoy desarrollando una aplicación de Python App Engine, donde quiero dividir el contenido de un archivo de código fuente Models.py en archivos separados para cada modelo, pero quiero ponerlo todo en una carpeta llamada Modelos. El problema es que cuando hago eso, mi aplicación ya no puede encontrar las clases. ¿Que debería hacer?¿Cómo organizar los archivos de código fuente de Python?

Esta pregunta no es sobre MVC but another question with the same title is.

Respuesta

12

Ponga un archivo __init__.py vacío en el directorio de Modelos.

Luego, en su aplicación; presumiblemente un nivel más arriba, que la referencia módulos en el directorio de modelos de esta manera:

import Models 

y hacer algo con él de esta manera:

Models.my_model.MyClassName 

También puede utilizar la palabra clave from así:

from Models import my_model 

y referencia así:

my_model.MyClassName 

Si sólo necesita un método de un módulo, también se puede hacer esto:

from Models.my_model import my_method_name 
my_method_name() 

enlace obligatorio a la documentation.

+3

He votado esto, con la advertencia de que el módulo y los nombres de los paquetes deben estar en minúscula. y que los directorios con archivos ____init____.py son paquetes, no módulos. –

+0

el problema con la división de clases en diferentes archivos en Python es que tengo que agregar el prefijo del módulo donde sea que lo use. Esto es engorroso y no ocurre en C# –

+0

@Jader: puede evitar tener que hacer esto importando las clases específicas que necesita explícitamente con 'from module import ClassName'. – bernie

4

En respuesta a su comentario a la respuesta de Adam, en cuanto a tener 10 importaciones para 10 clases, primero no olvide que no hay necesidad de tener una clase por módulo en Python. Los módulos deben organizarse por funcionalidad, por lo que puede agrupar las clases relacionadas en un solo archivo si tiene sentido.

Si todavía quería hacer todas las clases se pueden importar en una sola vez, puede importarlos todos en el archivo __init__.py sí mismo utilizando la sintaxis from submodule import Class, a continuación, sólo importar el módulo que contiene - import mainmodule y se refieren a mainmodule.Class1 etc, o incluso el uso from mainmodule import Class1, Class2, Class3 para importar las clases directamente a su espacio de nombres y consultarlas directamente.

Cuestiones relacionadas