Python 如何将多个模块分组到单个命名空间中?
我有一个python3.5项目,我决定为每个模块创建一个类。我决定这么做是因为我发现我的文件很长,我很难理解到底发生了什么 在进行更改后,我感觉在每个导入文件中重复自己的操作: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,
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方法。如果您仍然想这样做,那么只需制作一个mouleall.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风格)是不正确的,因此“必须看起来像”是很强的。人们一致认为它们是必要的或更好的,因此可以选择公认答案中的风格。