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

Posted

技术标签:

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

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

如果我这样做:

from core.curve import Curve

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

【问题讨论】:

【参考方案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 选择具体实现......

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

【讨论】:

以上是关于每次我从该模块导入任何内容时都会运行 __init__.py 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 和 __init__.py 中导入模块

python模块与包的导入

使用类的实例

如何修复导入时出错的模块中的SyntaxError?

Python:“导入”更喜欢啥 - 模块或包?

如何在包中只导入没有 exec __init__.py 的子模块