什么是包裹?

我们通常不会将所有文件都存储在计算机上的同一位置。我们使用组织良好的目录层次结构,以便于访问。
类似的文件保存在同一个目录下,比如我们可能把所有的歌曲都保存在“ music ”目录下。与此类似,Python 具有用于目录的包和用于文件的模块
随着我们的应用程序越来越大,模块越来越多,我们将相似的模块放在一个包中,将不同的模块放在不同的包中。这使得项目(程序)易于管理且概念清晰。
同样,由于目录可以包含子目录和文件,因此 Python 包可以包含子包和模块。
一个目录必须包含一个命名的文件init.py,以便 Python 将其视为一个包。这个文件可以留空,但我们通常将那个包的初始化代码放在这个文件中。
这是一个例子。假设我们正在开发一个游戏。一种可能的包和模块组织如下图所示。
image.png
Python编程中的包模块结构


从包中导入模块

我们可以使用点 (.) 运算符从包中导入模块。
例如,如果我们要导入上例中的start模块,可以如下进行:
import Game.Level.start
现在,如果这个模块包含一个名为的函数select_difficulty(),我们必须使用全名来引用它。
Game.Level.start.select_difficulty(2)

如果这个结构看起来很冗长,我们可以导入没有包前缀的模块,如下所示:
from Game.Level import start
我们现在可以简单地调用该函数,如下所示:
start.select_difficulty(2)
另一种从包内的模块导入所需函数(或类或变量)的方法如下:
from Game.Level.start import select_difficulty
现在我们可以直接调用这个函数了。
select_difficulty(2)
虽然更容易,但不推荐这种方法。使用完整的命名空间可避免混淆并防止两个相同的标识符名称发生冲突。
导入包时,Python 在 中定义的目录列表中查找sys.path,类似于模块搜索路径