如何将多个模块组合成一个命名空间?

roy*_*999 6 python python-import python-3.x

我有一个python3.5项目,我决定为每个模块创建一个类.我决定这样做,因为我发现我的文件很长,而且我很难理解发生了什么.

在我做出改变后,我觉得我在每个导入文件中重复自己:

from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
Run Code Online (Sandbox Code Playgroud)

有没有办法通过重复?我想我的进口更像是:

from school import Student, ClassRoom, Teacher
Run Code Online (Sandbox Code Playgroud)

Ric*_*ica 7

使用__init__模块来完成此任务.__init__导入父模块/包时,将评估模块的内容.像这样:

# __init__.py
from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
Run Code Online (Sandbox Code Playgroud)

这带来了Student,ClassRoomTeacher进入school命名空间.现在您可以根据需要使用school模块导入.

警告:以这种方式污染命名空间非常容易.最好以您开始的方式在每个模块中显式导入,或者在此答案中使用该方法并使用使用显式模块引用的类(例如,school.Teacher()而不是Teacher()).

如果你感觉school.Teacher()太长,你可以这样缩短一点:

import school as sch
teacher = sch.Teacher()
Run Code Online (Sandbox Code Playgroud)

等等

但是,另一方面,如果这些类是应该在包级别可用的对象,则将它们导入包命名空间可能是正确的做法.只有你能做出决定.


sty*_*ane 5

我认为school是一个软件包,如果不是你需要创建一个软件包并将所有模块放入软件包然后创建一个__init__.py文件,你基本上把所有的东西粘在一起.您需要在__init__.py文件中使用相对导入.

您的包现在必须如下所示:

school/
__init__.py
student.py
classroom.py
teacher.py
Run Code Online (Sandbox Code Playgroud)

然后你__init__.py必须看起来像这样:

from .student import Students
from .classroom import ClassRoom
from .teacher import Teacher
Run Code Online (Sandbox Code Playgroud)

接下来只使用包名称调用您的类,如下所示:

import school
t = school.Teacher()
Run Code Online (Sandbox Code Playgroud)