2010-04-14 30 views
31

Soy muy nuevo en Python (vengo de un fondo JAVA) y me pregunto si alguien podría ayudarme con algunos de los estándares de Python. ¿Es una práctica normal o "adecuada" colocar múltiples clases en un módulo? He estado trabajando con Django y comencé con los tutoriales y colocan sus clases de modelo de base de datos en el mismo módulo. ¿Esto es algo que normalmente se hace o debería quedarme con 1 clase por módulo? ¿Hay alguna razón por la que haría una sobre la otra?Múltiples clases en un módulo de Python

Espero ser claro y no genérico. ¡Gracias a todos por adelantado!

+1

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

+0

Me he preguntado lo mismo. (Soy nuevo en Python con experiencia en Java.) Además, ¿cómo encajan los paquetes en la mente Pythonic? –

Respuesta

28

Aquí es una regla útil de lo que he visto de los proyectos típicos de Java:

El paquete más inferior en Java debe ser un archivo en Python

¿Qué significa eso ? Si se organizó el proyecto Java:

toplevel/ 
    subproject/ 
     Foo.java 
     Bar.java 
    subproject2/ 
     Baz.java 
     Qux.java 

Entonces su proyecto Python debe verse como:

toplevel/ 
    subproject.py <-- put class Foo, Bar here 
    subproject2.py <-- put class Baz, Qux here 

cosas a destacar re: organización:

  • No usar clases internas. Sólo hay que poner clases en el mismo módulo
  • Por convención, las cosas que comienzan con _ son "privado"
  • Está bien tener "variables públicas"
5

Es absolutamente correcto hacerlo. Un módulo agrupa la funcionalidad relacionada. Si esa funcionalidad se implementa en varias clases (por ejemplo, Árbol, Nodo, Hoja), entonces es apropiado colocarlas juntas.

Un módulo está más estrechamente asociado con un paquete de Java que con una clase de Java. También puede implementar un módulo como una carpeta, nombrada para el módulo, con un archivo __init__.py dentro (para que Python pueda identificar el módulo como tal; el __init__.py también puede incluir opcionalmente código de inicialización y listas de clases, funciones y subpaquetes para exportar)

+0

Tenga en cuenta que la mayoría de los estándares de estilo tienen '__init __. Py' vacío o cerca de vacío. Resulta que puede ser confuso y sentirse desorganizado tener módulos que contengan tanto submódulos como cosas normales en los mismos niveles. –

+0

@Mike Graham: django coloca muchas funciones y clases en archivos '__init __. Py' y django parece ser muy respetado. – blokeley

+0

@blokeley, Django es ciertamente popular, pero no sé si se considera que se adhiere a los mejores principios de Python. Nunca he usado Django, pero parece que se requiere que las personas realicen un registro de cosas horribles para que funcionen sus aplicaciones. Consulte http://jcalderone.livejournal.com/39794.html y http://effbot.org/pyfaq/what-is-init-py-used-for.htm y varios hilos SO para leer sobre '__init __. Py' usualmente siendo vacío. Los proyectos en mi sitio-paquetes que hacen esto incluyen Twisted, PyMeta y PyFlakes. –

4

Sin duda es algo normal de hacer en Python. Cuándo y por qué eliges uno sobre el otro es en parte una cuestión de gusto, y en parte convencional.

Si aún conoces Python, y por lo tanto sus convenciones, vale la pena leer the style guide.

5

En caso de duda, sólo tiene que buscar en las bibliotecas estándar de Python :)

Por ejemplo, el módulo de calendario estándar contiene 31 clases. Entonces sí, está bien.

4

Piense de esta manera.

En Java, lo que escribe es una clase en la que, en el caso de Python, escribe un módulo en lugar de una clase. Entonces un módulo puede contener varias clases. Cuando quiera usar una clase en particular, primero importe el módulo respectivo y luego llame a la clase para crear objetos.

Aquí hay un ejemplo.

Classes.py (Se trata de un módulo denominado 'clases')


class MyClass(object): 


    def greet(self): 
     print("Hello World") 


class MyNextClass(object): 

    def greetAgain(self): 
     print("Hello again") 

Ahora puedo importar este módulo desde cualquier deseo


import Classes 

if __name__ == '__main__': 

    a=Classes.MyClass() 
    a.greet() 

    b=Classes.MyNextClass() 
    b.greetAgain()