我有一个python3.5项目,我决定为每个模块创建一个类。我决定这样做,因为我发现我的文件很长,而且我很难理解发生了什么。
在我做出更改之后,我觉得我在每个导入文件中重复自己:
from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
有没有办法通过重复?我希望我的进口更像是:
from school import Student, ClassRoom, Teacher
答案 0 :(得分:7)
使用__init__
模块完成此操作。导入父模块/包时,将评估__init__
模块的内容。像这样:
# __init__.py
from school.student import Student
from school.classroom import ClassRoom
from school.teacher import Teacher
这会将Student
,ClassRoom
和Teacher
带入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
但你可以看到这是多余和丑陋的。