2012-05-08 43 views
5

Me dijeron recientemente que debería mantener mi código en archivos separados; como main.py, engine.py, settings.py y así sucesivamente. Aunque esto seguramente tiene beneficios, como una administración más sencilla, escalabilidad y otros, para mí parece que tiene demasiados inconvenientes ...¿Cómo organizar mi código de Python en múltiples clases?

Por ejemplo, si tengo un script llamado settings.py, donde algunas cosas como tamaños de pantalla Se definen los objetos, la velocidad de la simulación y el color de varios objetos, ¿qué debo hacer si esas variables son necesarias tanto en mi script engine.py como en mi script main.py? ¿Lo importo dos veces, en ambos guiones? Parece bastante desordenado. ¿Qué pasa si algunas de mis clases, que están en el script engine.py, requieren el código de main.py?

Te voy a enseñar la situación exacta ...

Mi script main.py importa Pygame en sí mismo, lo inicializa, y así sucesivamente. Solía ​​tener una clase que representaba un objeto en pantalla, y esa clase tenía un método draw, que acaba de llamar una función de dibujo Pygame. Ahora, cuando puse la clase dentro de mi script engine.py, las cosas ya no funcionan, ¡porque Pygame no existe allí! Terminé importando tanto settings.py como Pygame en el engine.py, y luego importando el motor en main.py, pero luego es más como un inicializador que como un motor ... ¿Hay alguna manera de tratar con cosas como estas, como las líneas de guía generales?

+1

Parece que está tratando de evitar la importación de módulos en los que ha dividido su código. Si este es el caso, realmente debería importar solo cuando sea necesario. – inspectorG4dget

+10

¡Cualquier molestia que sienta al dividir su código en varios archivos va a palidecer en comparación cuando tiene que regresar y mantener un archivo de 5000 líneas que no ha analizado en un par de meses! –

Respuesta

1

Deberías echarle un vistazo a este modelo, que podría ayudarte a entender las cosas. Creo que este es el que serían más adecuadas con lo que quiere hacer

Model-View-Controller

Algunos más doc aquí: http://www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

En este caso, las importaciones deben parecer bastante lógico y necesario . Y agregaría que es más o menos lo que ya hace con sus 3 archivos.

+0

¿Qué tiene que ver MVC con la pregunta? – rantanplan

+0

De la explicación, me parece lógico que describa un MVC (datos, funcionalidad central y interfaz) – jlengrand

+0

Incluso entonces, los 'datos',' core' y 'front' pueden desglosarse en decenas de archivos diferentes/módulos para cada uno. Entonces su pregunta todavía se aplica. Es un poco irrelevante, creo, pero no te rebajaré. – rantanplan

1

No es una respuesta, pero:

settings.py realmente debería estar settings.ini, y es preferible hacerlo mediante ConfigParser. Lea el archivo de configuración una vez y comparta el resultado ConfigParser.RawConfigParser entre los módulos.

+0

¿Pero por qué? Simplemente parece más una molestia. Puedo tener un archivo limpio, '.py' que se parece a' name = value', a diferencia de esas secciones y todo eso ... Además, necesito un script que lea la configuración, y luego tengo que importarlo en todas partes ¿más? ¿No es eso prácticamente lo que estoy haciendo en este momento, excepto que estoy estableciendo esos valores directamente, no leyéndolos desde un archivo separado o algo así? Por favor responde, me gustaría saber! – corazza

+0

No solo eso, si yo, por ejemplo, quiero guardar una tupla, ¡se convierte en una cadena! – corazza

1

Es una práctica común en otros lenguajes (especialmente Java, donde es prácticamente obligado por el compilador) tener un archivo por clase.

En cuanto a las dependencias entre archivos que menciona, debería considerar evitar las variables globales.

Aquí hay otra pregunta relacionada que responde mejor a su pregunta.

How many Python classes should I put in one file?

0

Puede importar símbolos de settings.py en cualquiera de los módulos que se necesitan. Ese es el concepto. Un problema real es cuando tienes importaciones circulares. p.ej. ¿Qué sucede si tiene algunos símbolos dentro de engine.py que se necesitan en main.py y viceversa? En esa situación, un patrón común es romper estas dependencias en un tercer módulo, donde podrían importarse main.py y engine.py, sin ningún problema.

1

Importar un módulo en otros muchos módulos no es complicado. Es mucho más limpio que un módulo con muchos miles de líneas de código.

Es cierto que las importaciones circular son problemáticas. Pero su situación no parece que vaya a haber un problema circular de importación. Usted dice que "ahora, cuando puse la clase dentro de mi script engine.py, las cosas ya no funcionan, porque Pygame no existe allí. Terminé importando tanto settings.py como Pygame en el motor.py, y luego importando el motor en main.py ".

¿Por qué no puede simplemente poner la clase en engine.py y luego importarla en main.py? Una forma muy simple de hacer esto sería para pasar una devolución de llamada a su clase:

# engine.py 
... 
class ClassWithDraw(Subclass): 
    def __init__(self, draw_callback): 
     ... 
     self._draw_func = draw_callback 
     ... 
    def draw(self): 
     self._draw_func() 

# main.py 

from engine import ClassWithDraw 
drawer = ClassWithDraw(drawfunc) 

Lo bueno de este enfoque es que el objeto es realmente sólo es responsable de una cosa: su propio estado. De hecho, podría tener más sentido para este objeto no tener un método draw; o podría tener un draw_hook que se llamaría para obtener datos dibujables cuando sea necesario, y otra función de extracción externa podría llamarlo.

Otro enfoque más sería tener un módulo completamente separado para Pygame. No sé mucho sobre Pygame, por lo que es posible que esto no funcione, pero supongamos que tienes un módulo que maneja la inicialización y el estado de Pygame. Puede inicializarlo una vez, en main, e importarlo donde desee.

Cuestiones relacionadas