核心要点
知道 .py 文件即模块、包需 init.py(或 namespace package)
掌握 import / from ... import 与 name == main
了解模块搜索路径 sys.path
简要回答
把代码保存为 .py 即模块;目录加 init.py 成包;用 import 导入;直接运行脚本时 name 为 "main"。
标准回答
一、先给出结论和背景
- 模块:任意
.py文件即模块,文件名(去 .py)为模块名。 - 包(Package):含
__init__.py的目录(Python 3.3+ namespace package 可无 init)。支持pkg.submod层级导入。
二、拆开关键步骤和判断点
- 导入:示例代码可以这样理解:
import mymod
from mypkg import utils
from mypkg.utils import helper as h - 入口守卫:示例代码可以这样理解:
if name == "main":
main() # 仅直接 python script.py 时执行
三、补上落地边界和取舍
- 搜索路径:当前目录、PYTHONPATH、site-packages。项目结构常用
src layout+ 虚拟环境。 - AI 项目:
models/,data/,train.py分模块;pip install -e .可编辑安装本地包。
回答时可以顺手补一个真实项目结构:训练脚本放在 scripts/train.py,模型定义放在 src/project/models.py,数据处理放在 src/project/data.py,通过包导入而不是到处改 sys.path。这样能说明你知道模块化的目的不是“文件拆开”,而是让训练、推理、测试和复用都更稳定。
回答思路
【定义】用一句话说清「如何在 Python 中创建模块」
【原理】讲清关键机制或步骤(2~3 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
误区一:容易答偏的地方:只罗列名词、不会举例;混淆相似概念;忽略工程约束(成本、延迟、数据质量)。不确定时应主动说明假设。
追问
追问 1:import 时模块代码会执行几次?
每个解释器进程内,模块首次 import 时顶层代码执行一次,结果缓存在 sys.modules;后续 import 直接取缓存。importlib.reload() 可强制重载。
追问 2:__init__.py 里通常写什么?
包初始化、导出公共 API(__all__)、聚合子模块导入。可为空文件仅标记包。避免在 __init__.py 放重量级副作用代码拖慢 import。
追问 3:相对导入和绝对导入如何选择?
包内模块互引用用 from . import sibling 或 from ..parent import x。脚本直接运行时不应依赖相对导入(无包上下文)。库开发推荐绝对导入更清晰。
🔗 相似问题
同一考点的不同问法,换着练更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
