【问题标题】:How to group mutliple modules into a single namespace?如何将多个模块分组到一个命名空间中?
【发布时间】:2016-04-11 18:27:45
【问题描述】:

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

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

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

有没有办法通过重复?我希望我的导入更像:

from school import Student, ClassRoom, Teacher

【问题讨论】:

  • “我决定为每个模块创建一个类” - 为什么?这不是 Java。你不需要这样做。
  • 为什么在这种情况下每个模块一个类?所有这些模型不都是同一个领域的吗?也许他们属于一起?
  • 他说他这样做是为了可读性,这是一个非常合理的动机。

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


【解决方案1】:

使用__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()

等等等等

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为作为公认的答案表明,相对导入是不正确的(来自 .student 风格),所以“必须看起来像”很强大。人们一致认为它们是必需的或更好的,因此可能首选已接受答案中的样式。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2013-03-24
      • 2011-04-13
      • 1970-01-01
      • 2021-02-17
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多