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

时间:2016-04-11 18:27:45

标签: python python-3.x python-import

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

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

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

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

from school import Student, ClassRoom, Teacher

3 个答案:

答案 0 :(得分:7)

使用__init__模块完成此操作。导入父模块/包时,将评估__init__模块的内容。像这样:

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

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

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

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

import school as sch
teacher = sch.Teacher()

等等。

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

答案 1 :(得分:5)

我认为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

接下来只使用包名称调用您的类:

import school
t = school.Teacher()

答案 2 :(得分:-1)

是的,你可以。只需将所有类放在模块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 但你可以看到这是多余和丑陋的。