0Pricing
Python Academy · 课时

包与 __init__.py

通过合理的目录结构将模块组织成包。

包与 __init__.py 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

什么是包?

包是包含 __init__.py 文件和一个或多个模块的目录。Python 会将这样的目录视为可以从中导入内容的包。

mypackage/
    __init__.py
    utils.py
    math_helpers.py

__init__.py 文件

导入包时会运行 __init__.py。它可以为空,也可以向调用方公开选定的名称。

# mypackage/__init__.py
from .utils import helper
from .math_helpers import add

从包中导入

使用点号表示法导入子模块,或导入 __init__.py 中定义的名称。

import mypackage
from mypackage import helper
from mypackage.math_helpers import add
print(add(2, 3))

子包

包可以嵌套:包含自身 __init__.py 的子目录会成为子包。

mypackage/
    __init__.py
    network/
        __init__.py
        http.py

相对导入

在包内部,可以使用以点号开头的相对导入来引用同级模块,而不必将包名称硬编码。

# mypackage/network/http.py
from ..utils import helper   # two levels up

绝对导入与相对导入

绝对导入含义明确,因此更受推荐。在大型包内部,相对导入有助于避免过长的名称。

# Absolute
from mypackage.utils import helper

# Relative (inside mypackage)
from .utils import helper

__init__.py 中的 __all__

定义 __all__,即可控制 from package import * 导出的内容。

# mypackage/__init__.py
__all__ = ['helper', 'add']
from .utils import helper
from .math_helpers import add

命名空间包(PEP 420)

Python 3.3 及更高版本支持命名空间包,即不包含 __init__.py 的目录。这适合将一个包拆分到多个目录中。

# No __init__.py needed
# Just have the directory and import normally
import myns.module

包的 __init__ 初始化

使用 __init__.py 设置包级常量、配置日志记录,或延迟加载较大的子模块。

# mypackage/__init__.py
import logging
logging.getLogger(__name__).addHandler(logging.NullHandler())
VERSION = '1.0.0'

分发包

添加 pyproject.toml 或 setup.py,即可让您的包能够使用 pip 安装。

# pyproject.toml excerpt
[project]
name = "mypackage"
version = "1.0.0"

# Install locally
# pip install -e .

检查包属性

使用 __file__、__path__ 和 __name__,可以在运行时检查包的元数据。

import mypackage
print(mypackage.__file__)   # path to __init__.py
print(mypackage.__path__)   # list of directory paths
print(mypackage.__name__)   # 'mypackage'

快速检查

哪个文件会使一个目录成为 Python 包?

回顾

包使用 __init__.py 将模块组织到目录中。使用绝对导入可以提高可读性,在包内部使用相对导入,并使用 __all__ 控制公共接口。

常见问题解答

「包与 __init__.py」课时是免费的吗?

是的 — 「包与 __init__.py」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「包与 __init__.py」这节课中我会学到什么?

通过合理的目录结构将模块组织成包。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「包与 __init__.py」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建与导入模块
  2. Python 标准库
  3. 包与 __init__.py
  4. 使用 pip 安装包
← 返回 Python Academy