2010-10-01 27 views
53

Me gusta la convención de Java de tener una clase pública por archivo, incluso si a veces hay buenas razones para incluir más de una clase pública en un único archivo. En mi caso, tengo implementaciones alternativas de la misma interfaz. Pero si me gustaría colocarlos en archivos separados, tendría nombres redundantes en las declaraciones de importación (o engañosa nombres de los módulos):Organizar clases de Python en módulos y/o paquetes

import someConverter.SomeConverter 

mientras que someConverter serían el archivo (y módulo) nombre y el nombre de clase SomeConverter . Esto se ve bastante poco elegante para mí. Para poner todas las clases alternativas en un solo archivo daría lugar a una declaración de importación más significativo:

import converters.SomeConverter 

pero me temo que los archivos se vuelven bastante grande, si pongo todas las clases relacionadas en un único archivo de módulo. ¿Cuál es la mejor práctica de Python aquí? Es una clase por archivo inusual?

+7

en el momento en que está tratando con un proyecto que consiste en 10'000 clases, usted será feliz si puede encontrar una clase (público) por su archivo (y el paquete) en lugar del nombre tener que buscar el contenido de un ll archivos ... esa es probablemente la razón por la cual Java exige que haya solo una clase pública por archivo y que el nombre del archivo debe ser el nombre de la clase. –

Respuesta

55

Mucho de esto es una preferencia personal. El uso de módulos de Python, usted tiene la opción de mantener cada clase en un archivo separado y todavía permitir import converters.SomeConverter (o from converters import SomeConverter)

Su estructura de archivos podría ser algo como esto:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

y luego en su __init__.py archivo:

from baseconverter import BaseConverter 
from otherconverter import OtherConverter 
36

rompe solución de Zach en Python 3. Aquí es una solución fija.

Mucho de esto es una preferencia personal. El uso de módulos de Python, usted tiene la opción de mantener cada clase en un archivo separado y todavía permitir import converters.SomeConverter (o from converters import SomeConverter)

Su estructura de archivos podría ser algo como esto:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

y luego en su __init__.py archivo:

from converters.baseconverter import BaseConverter 
from converters.otherconverter import OtherConverter 
+1

¿Qué tal solo "de .baseconverter import BaseConverter"? –

+0

Perdón por el seguimiento tardío, he estado fuera de contacto con Python en los últimos tiempos, si alguien puede verificar la solución de Michael anteriormente, no dude en editar mi respuesta y agregarla como alternativa. (No cambie mi original porque creo que es una cuestión de preferencia en cuanto a cuál parece más legible, así que ofrezcamos a los usuarios las dos opciones) – Spundun

+6

La respuesta de Michael funciona, pero PEP 8 desalienta las importaciones relativas. http://stackoverflow.com/questions/4209641/absolute-vs-expllicit-relative-import-of-python-module –

Cuestiones relacionadas