__init__.py
文件的主要作用是标记一个目录为 Python 包。这样,Python 才能认识到子目录应被视为一个包或模块的集合。除了定义 __version__
,__init__.py
可以定义或包含多种内容,具体取决于包的目的和设计。以下是在 __init__.py
中常见的内容和最佳实践:
-
包的文档字符串 (docstring):
在__init__.py
的开头添加一段描述该包的文档字符串是一个好习惯。""" MyPackage does XYZ and provides utilities for ... """
-
导入子模块:
为了使得用户可以直接从包中导入某个子模块或子包中的类/函数/变量,可以在__init__.py
中进行导入。from .submodule import MyClass, my_function
-
__all__
变量:
定义一个__all__
列表,列出应该在执行from package import *
时导入的模块或对象名称。这有助于控制公共API的内容。__all__ = ['MyClass', 'my_function', 'submodule1', 'submodule2']
-
初始化代码:
如果包需要在被导入时执行一些初始化操作(例如配置、连接数据库等),可以在__init__.py
中添加相应的代码。 -
隐藏内部模块:
如果你不希望用户直接访问某些模块,你可以在这些模块的名称前添加一个下划线_
,并在__init__.py
中不进行导入。 -
定义包级常量和变量:
对于那些在整个包范围内共享的常量或变量,可以在__init__.py
中定义。 -
定义包级异常:
如果你的包有特定的异常类型,你可以在__init__.py
中定义或导入它们,以方便用户捕获。
最佳实践:
- 简洁性: 保持
__init__.py
尽量简洁,避免在其中放入大量的逻辑或定义。 - 明确导出: 使用
__all__
定义明确要导出的内容,以控制API的暴露。 - 避免依赖: 尽量避免在
__init__.py
中添加可能导致包导入失败的代码,例如在初始化时连接数据库或其他可能失败的操作。 - 文档: 为包和导出的所有公共成员提供适当的文档字符串。
最后,请根据你的项目的具体需要和结构来决定在 __init__.py
中放置什么内容。