Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个模块分组到单个命名空间中?_Python_Python 3.x_Python Import - Fatal编程技术网

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

Python 如何将多个模块分组到单个命名空间中?,python,python-3.x,python-import,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,

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

在进行更改后,我感觉在每个导入文件中重复自己的操作:

from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
有没有办法重复一遍?我希望我的进口产品更像:

from school import Student, ClassRoom, Teacher

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

# __init__.py
from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
这将
学生
教室
教师
带入
学校
名称空间。现在,您可以根据需要使用
学校
模块进行导入

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

如果您觉得
school.Teacher()
太长,您可以通过以下方式缩短时间:

import school as sch
teacher = sch.Teacher()
等等


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

是的,你可以。只需将所有课程放在module
school.py
中即可。这就是Python模块的用途。您刚才向我们展示的是通过包维护名称空间的Java方法。如果您仍然想这样做,那么只需制作一个moule
all.py
并编写

# all.py
from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
在主文件中,从学校写入
。所有导入学生、教室、教师

但是你可以看到这是多余的和丑陋的。

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

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

school/
__init__.py
student.py
classroom.py
teacher.py
from .student import Students
from .classroom import ClassRoom
from .teacher import Teacher
import school
t = school.Teacher()
那么您的
\uuuu init\uuuu.py
必须如下所示:

school/
__init__.py
student.py
classroom.py
teacher.py
from .student import Students
from .classroom import ClassRoom
from .teacher import Teacher
import school
t = school.Teacher()
下一步仅使用包名调用类,如下所示:

school/
__init__.py
student.py
classroom.py
teacher.py
from .student import Students
from .classroom import ClassRoom
from .teacher import Teacher
import school
t = school.Teacher()

“我决定每个模块上一节课”-为什么?这不是Java;你不需要这样做。为什么在这种情况下每个模块一个类?这些模型不都是同一领域的吗?也许它们属于一起?他说他这样做是为了可读性,这是一个非常合理的动机。我认为,正如公认的答案所表明的那样,需要相对导入(from.student风格)是不正确的,因此“必须看起来像”是很强的。人们一致认为它们是必要的或更好的,因此可以选择公认答案中的风格。