Python 包(Package)

当应用程序或项目具有较多的功能模块时,如果把他们都放在同一个文件夹下,就显得不合理了,这时,可以使用Python中提供的包来管理较多的功能模块,包其实就是包含一个__init__文件的文件夹,文件夹内可以组织子模块或子包。

什么是包(Package)?

我们通常不会把所有的文件都存储在同一个地方。我们使用一个组织良好的目录层次结构,以方便访问。

相似的文件保存在同一目录中,例如,我们可以将所有歌曲保留在“music”目录中。与此类似,Python具有用于目录的软件包和用于文件的模块。

随着我们的应用程序规模越来越大,带有许多模块,我们将相似的模块放在一个包中,而将不同的模块放在不同的包中。这使项目(程序)易于管理且概念清晰。

类似地,由于目录可以包含子目录和文件,因此Python程序包可以具有子程序包和模块。

目录必须包含一个名为 __init__.py 的文件,Python才能将其视为一个包。该文件可以保留为空,但是我们通常将该程序包的初始化代码放入此文件中。

这是一个实例。假设我们正在开发一个游戏,则可能的包和模块组织如下图所示。

image.png

从包中导入模块

我们可以使用点(.)运算符从包中导入模块。

例如,如果要在上面的示例中导入 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中定义的目录列表,类似于模块搜索路径。

编程笔记 » Python 包(Package)