Python中__init__.py文件的作用

Python中__init__.py文件的作用

技术背景

在Python编程里,模块和包是组织代码的重要方式。模块是一个包含Python代码的文件,而包则是一个包含多个模块的目录。__init__.py文件在Python的包管理体系中曾经扮演着关键角色。

实现步骤

标记目录为Python包

在Python 3.3之前,若要将一个目录当作Python包,就必须在该目录下放置__init__.py文件。例如:

1
2
3
4
mydir/
spam/
__init__.py
module.py

mydir处于Python的搜索路径中时,就能够像下面这样导入module.py里的代码:

1
import spam.module

或者

1
from spam import module

要是移除了__init__.py文件,Python就不会再去该目录下查找子模块,此时尝试导入模块就会失败。

包级别的初始化和变量定义

__init__.py文件可用于执行包级别的初始化代码,还能定义包级别的变量。例如:

1
2
3
4
5
6
7
# database/__init__.py
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

这样一来,就能在其他地方轻松地启动新会话:

1
2
from database import Session
session = Session()

控制import *的行为

借助__init__.py文件中的__all__变量,可以控制使用import *时导入的模块。例如:

1
2
# subPackage_b/__init__.py
__all__ = ['module_n2', 'module_n3']

这样,当执行from package_x.subPackage_b import *时,就只会导入module_n2module_n3

核心代码

以下是__init__.py文件的一些常见用法示例:

空的__init__.py文件

1
2
3
4
mydir/
spam/
__init__.py # 空文件
module.py

定义包级变量的__init__.py文件

1
2
3
4
5
6
7
# database/__init__.py
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

控制import *行为的__init__.py文件

1
2
# subPackage_b/__init__.py
__all__ = ['module_n2', 'module_n3']

最佳实践

  • 保持简洁__init__.py文件应当尽量简洁,防止违反“显式优于隐式”的原则。
  • 避免命名空间混乱:若要在__init__.py中导入和导出模块,可使用__all__变量来限制导入内容,或者采用单下划线开头的变量。
  • 考虑兼容性:尽管从Python 3.3开始,__init__.py文件不再是必需的,但为了保证代码的兼容性,建议还是包含该文件。

常见问题

从Python 3.3起,__init__.py文件不再必需

自Python 3.3起,支持隐式命名空间包,即无需__init__.py文件就能将目录定义为可导入的Python包。不过,这属于命名空间包,与传统的包含__init__.py文件的常规包有所不同。

循环导入问题

若在__init__.py文件中进行大量的导入操作,可能会引发循环导入问题。所以,要谨慎处理导入逻辑,避免出现循环依赖。

import *的使用

使用import *会导致命名空间混乱,建议尽量避免使用,而是显式地导入所需的模块和函数。


Python中__init__.py文件的作用
https://119291.xyz/posts/2025-04-21.python-init-py-file-function/
作者
ww
发布于
2025年4月22日
许可协议