【问题标题】:Is __init__.py run everytime I import anything from that module? [duplicate]每次我从该模块导入任何内容时都会运行 __init__.py 吗? [复制]
【发布时间】:2018-01-07 02:18:21
【问题描述】:

我有一个名为 core 的模块,其中包含许多 python 文件。

如果我这样做:

from core.curve import Curve

__init__.py 会被调用吗?我可以将适用于所有核心文件的导入语句移动到__init__.py 以节省重复自己吗? __init__.py应该输入什么?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    每次我从该模块导入任何内容时都会运行 __init__.py 吗?

    根据docs 在大多数情况下是的,它是。

    【讨论】:

    • 您在链接文档中的哪里看到 __init__.py 会在每次导入时加载?
    【解决方案2】:

    您可以在目录中添加您想要使用的所有功能

    - core
      - __init__.py
    

    在这个__init__.py 添加你的类和函数引用,比如

    from .curve import Curve 
    from .some import SomethingElse
    

    以及你想在哪里使用你的班级就像参考它

    from core import Curve
    

    【讨论】:

      【解决方案3】:

      我有一个名为 core 的模块,其中包含许多 python 文件。

      如果它包含 python 文件,它不是一个模块,它是一个包含 python 文件的目录 - 如果它包含一个 __init__.py 文件,最终是一个包。

      如果我这样做:from core.curve import Curve __init__.py 会被调用吗?

      它永远不会被“调用”——它不是一个函数——但它会在包或其中一个子模块第一次被导入进程时被加载。然后将其存储在sys.modules 中,随后的导入将在那里找到它。

      我可以将适用于所有核心文件的导入语句移动到 init.py 中以节省重复吗?

      不。命名空间是每个模块的,而不是每个包的。无论如何,这将是一个非常糟糕的主意,在这种情况下,您所说的“重复自己”是维护代码的真正帮手(显式导入意味着您可以毫不含糊地知道哪个符号来自哪个模块)。

      init.py 应该包含什么内容?

      从技术上讲,您实际上可以在 __init__.py 文件中放入任何您想要的内容,但大多数情况下它们只是空的。几个已知的用例是 using it as a facade 用于包的子模块,根据您当前的平台或某些环境变量等为通用 API 选择具体实现......

      哦,是的:它也是添加一些关于你的包的元信息(版本、作者等)的好地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2016-06-14
        • 2012-09-06
        • 1970-01-01
        • 2013-07-29
        • 2018-10-27
        相关资源
        最近更新 更多