2016-04-11 13 views
6

Ho un progetto python3.5 che ho deciso di creare una classe per modulo. Ho deciso di farlo perché ho scoperto che i miei file erano molto lunghi e mi è stato difficile capire cosa sta succedendo.Come raggruppare moduli multipli in un singolo spazio dei nomi?

Dopo che ho fatto il cambio mi sento come mi sto ripetendo in ogni file di importazione:

from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

C'è un modo passano che si ripetono? Vorrei che i miei importazioni saranno più simile:

from school import Student, ClassRoom, Teacher 
+3

"che ho deciso di fare una classe per modulo" - perché? Questo non è Java; non hai bisogno di farlo. – user2357112

+2

Perché una classe per modulo in questo caso? Non tutti questi modelli hanno lo stesso dominio? Forse appartengono insieme? – fips

+0

Ha detto che lo ha fatto per la leggibilità, che è una motivazione molto ragionevole. – fgblomqvist

risposta

6

utilizzare un modulo __init__ per raggiungere questo obiettivo. Il contenuto di un modulo __init__ viene valutato quando viene importato il modulo/pacchetto genitore. Come questo:

# __init__.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

Questo porta Student, ClassRoom e Teacher nella school namespace. Ora puoi importare usando il modulo school come preferisci.

Attenzione: è molto facile inquinare lo spazio dei nomi in questo modo. Probabilmente è meglio importare esplicitamente in ogni modulo il modo in cui hai iniziato, oppure utilizzare l'approccio in this answer e utilizzare le tue classi utilizzando riferimenti di moduli espliciti (ad esempio, school.Teacher() anziché Teacher()).

Se ti senti school.Teacher() è troppo lungo, è possibile abbreviare le cose un po 'in questo modo:

import school as sch 
teacher = sch.Teacher() 

ecc ecc

Tuttavia, d'altra parte, se le classi sono oggetti che dovrebbe essere disponibile a livello di pacchetto, importarli nello spazio dei nomi del pacchetto è probabilmente la cosa giusta da fare. Solo tu puoi fare quella determinazione.

0

Sì, è possibile. Basta inserire tutte le classi nel modulo school.py. Ecco cosa sono i moduli Python. Quello che ci hai appena mostrato è il modo Java (probabilmente) di mantenere lo spazio dei nomi attraverso i pacchetti. Se si vuole ancora andare in quel modo poi basta fare una moule all.py e scrivere,

# all.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

e in voi file principale, scrivere from school.all import Student, ClassRoom, Teacher Ma si può vedere che è ridondante e brutto.

5

Si suppone che school sia un pacchetto, se non è necessario creare un pacchetto e inserire tutti i moduli nel pacchetto, quindi creare un file __init__.py in cui praticamente si incolla tutto insieme. È necessario utilizzare un'importazione relativa nel file __init__.py.pacchetto

Devi apparire così:

school/ 
__init__.py 
student.py 
classroom.py 
teacher.py 

Poi si __init__.py deve guardare in questo modo:

from .student import Students 
from .classroom import ClassRoom 
from .teacher import Teacher 

Avanti chiamare solo la classe usando il nome del pacchetto in questo modo:

import school 
t = school.Teacher()