每次我从该模块导入任何内容时都会运行 __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 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章