文章目录
- 前言
- 一、什么是 `__all__`?
- 二、基本用法:控制导入范围
- 三、默认行为:无 __all__ 的情况
- 四、为什么需要 __all__?
- 4.1. 控制公共 API
- 4.2. 避免命名空间污染
- 4.3. 提高可读性与维护性
- 五、高级用法:动态与包管理
- 5.1 动态修改 __all__
- 5.2 在包中的应用
- 六、注意事项
- 总结
前言
Python 的模块系统是其灵活性和可扩展性的基石之一。当我们用 import
引入模块时,如何控制哪些内容暴露给外部,哪些内容保持“低调”?在“Python 解码”系列的第五篇中,我们将聚焦一个不起眼却至关重要的变量——__all__
。它就像模块的“门卫”,守护着公共接口,防止内部细节无意泄露。
你是否曾在使用 from module import *
时感到困惑,不知道导入了什么?或者在设计模块时希望明确哪些功能是给外部使用的?通过本文,你将理解 __all__
的工作原理及其在模块设计中的妙用。让我们一起揭开这位守护者的神秘面纱吧!
一、什么是 __all__
?
在 Python 中,__all__
是一个特殊的变量,通常定义在模块的顶层。它是一个字符串列表,用于指定当使用 from module import *
时可以导入的名称。换句话说,__all__
是模块的公共接口声明,控制哪些变量、函数或类对外部可见。
- 核心作用:
- 显式定义模块的 API。
- 限制
*
导入的范围,隐藏内部实现。
- 默认行为:如果未定义
__all__
,from module import *
会导入所有不以下划线_
开头的名称。
简单来说,__all__
是模块作者对外部世界说:“这些是我想让你用的,其他的请别碰。”
二、基本用法:控制导入范围
让我们通过一个例子看看 __all__
如何工作。假设有一个模块 my_module.py
:
# my_module.py
__all__ = ['public_function', 'PublicClass']def public_function():return "This is public"def _private_function():return "This is private"class PublicClass:passclass _PrivateClass:pass
现在,在另一个文件中使用它