2010-10-01 15 views
53

Mi piace la convenzione Java di avere una classe pubblica per file, anche se a volte ci sono buone ragioni per inserire più di una classe pubblica in un singolo file. Nel mio caso ho implementazioni alternative della stessa interfaccia. Ma se io li metterei in file separati, avrei nomi ridondanti nelle istruzioni di importazione (o nomi di modulo ingannevole):Organizzazione delle classi Python in moduli e/o pacchetti

import someConverter.SomeConverter 

mentre someConverter sarebbe il file (e modulo) nome e il nome della classe SomeConverter . Questo mi sembra abbastanza poco elegante. Per mettere tutte le classi alternative in un unico file porterebbe ad un'istruzione import più significativo:

import converters.SomeConverter 

ma temo che i file diventano abbastanza grandi, se ho messo tutte le classi correlate in un unico file di modulo. Qual è la migliore pratica di Python qui? Una classe per file è inusuale?

+7

con il tempo hai a che fare con un progetto che consiste di 10.000 classi, sarete felici se si può trovare una classe (pubblico) dal suo file (e il pacchetto) nome invece di dover cercare il contenuto di a Tutti i file ... questo è probabilmente il motivo per cui Java impone che esiste solo una classe pubblica per file e che il nome del file deve essere il nome della classe. –

risposta

55

Gran parte delle preferenze personali. Utilizzando moduli Python, si ha la possibilità di mantenere ogni classe in un file separato e ancora consentire import converters.SomeConverter (o from converters import SomeConverter)

la struttura del file potrebbe essere simile a questo:

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

e poi nella vostra __init__.py di file:

from baseconverter import BaseConverter 
from otherconverter import OtherConverter 
36

pause soluzione di Zach su Python 3. Ecco una soluzione fissa.

Gran parte delle preferenze personali. Utilizzando moduli Python, si ha la possibilità di mantenere ogni classe in un file separato e ancora consentire import converters.SomeConverter (o from converters import SomeConverter)

la struttura del file potrebbe essere simile a questo:

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

e poi nella vostra __init__.py di file:

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

Che ne dici di "from .baseconverter import BaseConverter"? –

+0

Ci scusiamo per il follow-up in ritardo, sono stato fuori contatto con Python negli ultimi tempi, se qualcuno può verificare la soluzione di Michael qui sopra, per favore sentiti libero di modificare la mia risposta e aggiungerla come alternativa. (Non cambiare il mio originale perché penso che sia una questione di preferenza su quale sia più leggibile, quindi diamo agli utenti entrambe le opzioni) – Spundun

+6

La risposta di Michael funziona, ma PEP 8 scoraggia le importazioni relative. http://stackoverflow.com/questions/4209641/absolute-vs-explicit-relative-import-of-python-module –

Problemi correlati