../
Table of contents
__init__.py
在 Python 包中的作用
1. 基本功能
- 标记包:
__init__.py
文件用于标记一个目录为Python包。没有这个文件,Python会将该目录视为普通目录,而不是包。 - 初始化代码: 可以在
__init__.py
中编写初始化代码,这些代码会在包被导入时执行。 - 控制导入行为: 可以通过
__init__.py
来控制包的导入行为,比如导入子模块、设置包的命名空间等。
2. 简单示例
一个简单的包结构:
my_package/
├── __init__.py
├── module1.py
└── module2.py
简单的__init__.py
:
# 导入模块
from .module1 import function1
from .module2 import function2
# 定义包的公共接口
__all__ = ['function1', 'function2']
- 通过在
__init__.py
中导入模块,可以简化包的使用。 __all__
定义了from my_package import *
时导入的内容。
3. 复杂包结构中的__init__.py
对于复杂的包结构,__init__.py
可以用于组织子包和模块:
my_complex_package/
├── __init__.py
├── subpackage1/
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
└── subpackage2/
├── __init__.py
├── module3.py
└── module4.py
复杂的__init__.py
:
# 导入子包
from .subpackage1 import module1, module2
from .subpackage2 import module3, module4
# 定义包的公共接口
__all__ = ['module1', 'module2', 'module3', 'module4']
- 可以在
__init__.py
中导入子包和模块,提供统一的接口。 - 通过这种方式,用户可以直接使用
my_complex_package.module1
来访问模块。
4. 高级用法
动态导入:
- 可以在
__init__.py
中使用动态导入,根据条件导入模块。 - 例如,根据Python版本导入不同的模块。
- 可以在
命名空间管理:
- 使用
__init__.py
来管理包的命名空间,避免命名冲突。 - 可以通过
__init__.py
来重命名导入的模块。
- 使用
初始化逻辑:
- 可以在
__init__.py
中编写初始化逻辑,比如设置全局变量、配置日志等。
- 可以在
示例:
import sys
# 动态导入
if sys.version_info[0] < 3:
from .subpackage1 import module1 as mod1
else:
from .subpackage2 import module3 as mod1
# 初始化逻辑
print("Initializing my_complex_package")
# 定义包的公共接口
__all__ = ['mod1']
- 通过这种方式,可以根据条件导入不同的模块。
- 在包被导入时,打印初始化信息。
5. 总结
__init__.py
是Python包的重要组成部分,用于标记目录为包、初始化包、控制导入行为。- 在复杂包中,
__init__.py
可以用于组织子包和模块,提供统一的接口。 - 高级用法包括动态导入、命名空间管理和初始化逻辑。