Python包导入疑问:为何两种调用方式均生效?
为什么
import package_top后两种调用方式都能生效? 这是Python包导入机制的正常行为,核心原因在__init__.py的导入语句上:
当你执行import package_top时,Python会运行包根目录下的__init__.py。里面的from .module import hello这行代码,实际做了两件事:
- 把
module.py里的hello函数直接导入到package_top的命名空间里,所以package_top.hello()能正常调用,这和你理解的一致; - 而Python要完成“从module里取hello”这个动作,必须先完整加载
module模块,并且会自动把这个模块作为package_top的一个属性(也就是package_top.module)保留下来。这就导致你即使没显式写import package_top.module,也能通过package_top.module.hello()访问到函数。
如果想阻止package_top.module被外部访问,可以修改__init__.py,手动清理模块引用:
from .module import hello # 删除module的引用 del module
不过这种场景很少见,一般来说允许访问子模块并不会有什么问题。
你可以在main.py里加一行print(dir(package_top)),会看到输出里包含module,这就能直观证明模块已经被加载到包的命名空间中了。
内容的提问来源于stack exchange,提问作者zicheng zhang
相关产品推荐
相关产品推荐

