22、包
一 包介绍
随着模块数目的增多,把所有模块不加区分地放到一起也是极不合理的,于是Python为我们提供了一种把模块组织到一起的方法,即创建一个包。包就是一个含有 __ init __ .py文件的文件夹,文件夹内可以组织子模块或子包,例如
需要强调的是
接下来我们就以包pool为例来介绍包的使用,包内各文件内容如下
二 包的使用
2.1 导入包与 __ init __ .py
包属于模块的一种,因而包以及包内的模块均是用来被导入使用的,而绝非被直接执行,首次导入包(如import pool)同样会做三件事:
1、执行包下的 __ init __ .py文件
2、产生一个新的名称空间用于存放 __ init __ .py执行过程中产生的名字
3、在当前执行文件所在的名称空间中得到一个名字pool,该名字指向 __ init __ .py的名称空间,例如pool.xxx和pool.yyy中的xxx和yyy都是来自于pool下的 __ init __ .py,也就是说导入包时并不会导入包下所有的子模块与子包
pool.versions.check()要求pool下有名字versions,进而pool.versions下有名字check。pool.versions下已经有名字check了,所以问题出在pool下没有名字versions,这就需要在pool下的 __ init __ .py中导入模块versions
强调
2.2 绝对导入与相对导入
针对包内的模块之间互相导入,导入的方式有两种
1、绝对导入:以顶级包为起始
2、相对导入:.代表当前文件所在的目录,..代表当前目录的上一级目录,依此类推
同理,针对pool.futures.process.ProcessPoolExecutor(3),则需要
在包内使用相对导入还可以跨目录导入模块,比如thread.py中想引用versions.py的名字check
例1:
例2:
相对导入只能用from module import symbol的形式,import ..versions语法是不对的,且symbol只能是一个明确的名字
针对包内部模块之间的相互导入推荐使用相对导入,需要特别强调:
1、相对导入只能在包内部使用,用相对导入不同目录下的模块是非法的
2、无论是import还是from-import,但凡是在导入时带点的,点的左边必须是包,否则语法错误
2.3 from 包 import *
在使用包时同样支持from pool.futures import * ,毫无疑问 * 代表的是futures下 __ init __ .py中所有的名字,通用是用变量 __ all __ 来控制 * 代表的意思
最后说明一点,包内部的目录结构通常是包的开发者为了方便自己管理和维护代码而创建的,这种目录结构对包的使用者往往是无用的,此时通过操作 __ init __ .py可以“隐藏”包内部的目录结构,降低使用难度,比如想要让使用者直接使用
需要操作pool下的 __ init __ .py
__EOF__

本文链接:https://www.cnblogs.com/amgulen/p/13952224.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构