如何将多个模块分组到一个命名空间中?

How to group mutliple modules into a single namespace?

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

进行更改后,我觉得我在每个导入文件中都在重复自己:

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

有什么方法可以通过重复吗?我希望我的导入更像:

from school import Student, ClassRoom, Teacher

使用 __init__ 模块来完成此操作。 __init__ 模块的内容在导入父 module/package 时进行评估。像这样:

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

这会将 StudentClassRoomTeacher 带入 school 命名空间。现在您可以根据需要使用 school 模块导入。

注意:以这种方式很容易污染您的命名空间。最好按照您开始的方式在每个模块中显式导入,或者使用 中的方法并使用您的 类 使用显式模块引用(例如,school.Teacher() 而不是 Teacher()).

如果觉得school.Teacher()太长,可以这样缩短:

import school as sch
teacher = sch.Teacher()

等等等等

但是,另一方面,如果那些 类 是 应该 在包级别可用的对象,将它们导入包命名空间可能是正确的要做的事。只有你才能下定决心。

是的,你可以。只需将所有 类 放入模块 school.py 中即可。这就是 Python 模块的用途。您刚才向我们展示的是 Java 通过包维护名称空间的方式(可能)。如果你仍然想走那条路,那就做一个moule all.py 然后写,

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

在你的主文件中,写 from school.all import Student, ClassRoom, Teacher 但是你可以看到这是多余的和丑陋的。

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

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

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

那你__init__.py一定是这样的:

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

接下来只调用你的 class 使用这样的包名称:

import school
t = school.Teacher()