网易首页 > 网易号 > 正文 申请入驻

Python:__all__ 详解

0
分享至

在 Python 的模块与包体系中,__all__ 是一个看似简单却极具控制力的变量。它用于定义一个模块或包在使用 from xxx import * 时的公开接口(Public API),是实现封装、接口管理与工程化代码结构的关键工具。

Python 的导入机制向来强调“显式优于隐式”,而 __all__ 正体现了这一哲学:作者显式决定用户能看到什么、不能看到什么。

一、__all__ 的作用概述

在任何模块或者包的 __init__.py 中,只要定义了:

__all__ = ["name1", "name2", ...]

那么当用户执行:

from module import *

只有 __all__ 中列出的名称会被导入。

它本质上是一个导出白名单。

如果模块或包没有定义 __all__,那么:

from module import *

将导入所有不以下划线 _ 开头的名称。

示例:

def func(): pass

执行:

print(dir())

结果包含:

func

而 _y 被视为“内部名称”,不会被导入。

这也是为什么企业级项目往往认为 from ... import * 不够安全:

没定义 __all__ 时,公开接口是隐式推断的,容易产生污染与冲突。

二、__all__ 的标准写法与行为

(1)基本示例

    return "hidden"

用户端:

_secret()   # 报错:未导入

_secret 即使不以下划线开头,也不会被导入。

(2)在包的 __init__.py 中使用 __all__

位置结构:

    b.py

__init__.py:

__all__ = ["func_a", "func_b"]

用户只需:

from mypkg import *

即可获得统一后的公共接口。

(3)在多级包中的控制

层级结构:

        io.py

两层都可使用 __all__ 各自管理对上层的可见性,最终决定用户能访问什么。

三、__all__ 的设计动机

企业级项目通常强调 API 的稳定性与可控性,而 __all__ 能解决三个工程痛点。

(1)防止命名污染(避免 * 导入把内部逻辑暴露出去)

没有 __all__ 时,一个模块中新增任何“非下划线名称”,都会被自动公开,导致 API 不稳定。

(2)构建“面向用户的公共接口”

特别是在复杂包的 __init__.py 中,可以用 __all__ 构建统一接口层,让用户与内部结构解耦。

(3)稳固的封装机制

封装不仅是“不让别人看到”,更重要是“不让别人依赖内部结构”。

__all__ 让维护者可以明确声明 “这是对外 API,其余均为内部实现”。

四、常见使用模式

(1)显式导出函数与类

def utility(): ...

(2)阻止特定名称被导入

即使不以下划线开头,也可阻止导出:

__all__ = ["api"]

(3)组合多个子模块的接口成为统一 API

__all__ = ["add", "sub", "format_name"]

这让包即使内部结构复杂,对外接口仍保持整洁一致。

(4)动态构建 __all__

有时模块想自动暴露所有非下划线名称,但仍显式控制:

__all__ = [name for name in globals() if not name.startswith("_")]

或按规则过滤:

__all__ = [name for name in globals() if callable(globals()[name])]

适用于自动化驱动的大型工具包。

五、常见误区澄清

误区 1:__all__ 会影响普通 import

例如:

mathutils.func()  # 无论 __all__ 是否包含 func,都可访问

__all__ 仅影响 from module import *,不影响普通 import。

误区 2:定义了 __all__ 下划线函数就一定隐藏

错。

__all__ = ["_internal"]

from module import * 仍会导入 _internal,因为作者将其显式加入。

误区 3:在包中使用 __all__ 会自动导入模块

不会。

__all__ = ["a", "b"]

不会自动导入子模块 a.py 或 b.py,需要你显式写:

from . import a, b

六、完整示例(构建可维护的公共接口)

目录:

    multiply.py

add.py:

    return a + b

multiply.py:

    return a * b

__init__.py:

print("mypkg loaded.")

用户端:

print(mul(2, 5))

小结

__all__ 是 Python 模块化体系中极具工程价值的接口控制工具。它通过显式定义“允许被星号导入的名称”,使开发者能够严格管理对外 API,避免命名污染,并让大型包的结构清晰而稳定。它不影响普通导入,但能有效隔离内部实现,是构建高质量可维护库的重要机制。

熟练使用 __all__,意味着你不仅理解模块的组织方式,更真正理解了 Python 的“接口哲学”——清晰、显式、可控。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美航母还没到,伊朗抢先下死手!导弹绞杀盟友基地,五角大楼慌了

美航母还没到,伊朗抢先下死手!导弹绞杀盟友基地,五角大楼慌了

南山塔的姑娘
2026-01-24 18:09:27
轻断食再次封神!研究证实:能让肝脏脂肪在3个月内少25.5%!

轻断食再次封神!研究证实:能让肝脏脂肪在3个月内少25.5%!

健康之光
2026-01-09 06:20:03
太顶了!明明什么都没露,却性感得要命!

太顶了!明明什么都没露,却性感得要命!

贵圈真乱
2025-12-20 12:02:06
2-0横扫日本选手!中国女网又一16岁1米83新星崛起:偶像莱巴金娜

2-0横扫日本选手!中国女网又一16岁1米83新星崛起:偶像莱巴金娜

李喜林篮球绝杀
2026-01-26 10:37:38
他是潜藏在军队里的大间谍,给国家造成永久损失,被注射死刑严惩

他是潜藏在军队里的大间谍,给国家造成永久损失,被注射死刑严惩

近史谈
2025-10-23 20:24:33
热议杨鸣辞职:官微“恭喜脱离苦海”刷屏 火线就业29日解说湖人

热议杨鸣辞职:官微“恭喜脱离苦海”刷屏 火线就业29日解说湖人

醉卧浮生
2026-01-26 16:55:41
德国大师赛拒爆冷!艾伦两连鞭险胜莱恩斯,卫冕冠军和墨菲进32强

德国大师赛拒爆冷!艾伦两连鞭险胜莱恩斯,卫冕冠军和墨菲进32强

世界体坛观察家
2026-01-27 01:24:17
呼之欲出!欧洲冠军面临保级,英超降级队快要产生

呼之欲出!欧洲冠军面临保级,英超降级队快要产生

嗨皮看球
2026-01-26 18:32:36
台独分子赖清德、蔡英文突然发布声明:让世界看见台湾

台独分子赖清德、蔡英文突然发布声明:让世界看见台湾

扶苏聊历史
2026-01-26 17:59:32
CBA一夜3场险胜!北京双雄赢球,广东4连胜,最新积分:榜首易主

CBA一夜3场险胜!北京双雄赢球,广东4连胜,最新积分:榜首易主

小火箭爱体育
2026-01-26 21:46:46
向太太敢说了!自曝向华强今年已经78了,但是她和向华强还有X生活!

向太太敢说了!自曝向华强今年已经78了,但是她和向华强还有X生活!

八星人
2026-01-25 09:38:04
数千万波斯人,不伺候阿塞拜疆权贵了?伊朗今夜,就是百年前清末

数千万波斯人,不伺候阿塞拜疆权贵了?伊朗今夜,就是百年前清末

南宗历史
2026-01-10 16:15:24
女记者退脏童装后续,单位火速切割,人已经在产房,商家恐有麻烦

女记者退脏童装后续,单位火速切割,人已经在产房,商家恐有麻烦

离离言几许
2026-01-25 20:57:21
93年粮站来了个女劳改犯,我辞职下海那天,她拉着我:带我走

93年粮站来了个女劳改犯,我辞职下海那天,她拉着我:带我走

萧竹轻语
2026-01-22 14:58:10
阿姨这身打扮有一种80年代港风电影女明星的感觉

阿姨这身打扮有一种80年代港风电影女明星的感觉

美女穿搭分享
2025-12-21 10:52:57
卷来卷去,工资重回3000元时代!为什么这次大家不再抱怨了?

卷来卷去,工资重回3000元时代!为什么这次大家不再抱怨了?

另子维爱读史
2026-01-26 20:08:00
印尼放弃世青赛举办权,球迷呼吁印度效仿引热议

印尼放弃世青赛举办权,球迷呼吁印度效仿引热议

杨晨大神
2026-01-26 12:11:17
吃人的张彦泽,被人分吃了,五代十国的回旋镖来得很快

吃人的张彦泽,被人分吃了,五代十国的回旋镖来得很快

阿黼体育评论
2026-01-26 12:59:19
印度尼帕病毒疫情或来自医院

印度尼帕病毒疫情或来自医院

新华社
2026-01-26 13:53:03
上海小区真实事件:一楼奶奶同意交电梯费,结果整栋楼早高峰全卡壳

上海小区真实事件:一楼奶奶同意交电梯费,结果整栋楼早高峰全卡壳

趣味萌宠的日常
2026-01-20 15:00:21
2026-01-27 07:24:50
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1726文章数 72关注度
往期回顾 全部

科技要闻

印奇再上牌桌,阶跃融资50亿

头条要闻

女子被丈夫和闺蜜背叛一夜白头:听到儿子叫第三者妈妈

头条要闻

女子被丈夫和闺蜜背叛一夜白头:听到儿子叫第三者妈妈

体育要闻

叛逆的大公子,要砸了贝克汉姆这块招牌

娱乐要闻

张雨绮被抵制成功!辽视春晚已将她除名

财经要闻

从美式斩杀线看中国社会的制度韧性构建

汽车要闻

宾利第四台Batur敞篷版发布 解锁四项定制创新

态度原创

本地
艺术
手机
游戏
数码

本地新闻

云游中国|格尔木的四季朋友圈,张张值得你点赞

艺术要闻

王雪涛写凌波仙子,脱尽凡俗

手机要闻

苹果更改iOS 27内部代号,距离亮相仅剩五个月!

猎魂世界:先遣服1.5版本新内容汇总!这第7魂环真是够那个了!

数码要闻

1399元 小米首款儿童手表开售:秒级连续定位、支持水域提醒

无障碍浏览 进入关怀版