创建和访问Python包
包是一种结构化许多包和模块的方法,它有助于组织良好的数据集层次结构,使目录和模块易于访问。就像操作系统中有不同的驱动器和文件夹来帮助我们存储文件一样,包也帮助我们存储其他子包和模块,以便用户在需要时使用。
创建和探索包
为了告诉Python一个特定的目录是一个包,我们在其中创建一个名为 __init__.py 的文件,然后将其视为一个包,我们可以在其中创建其他模块和子包。这个 __init__.py 文件可以留空,也可以使用包的初始化代码进行编码。
要在Python中创建包,我们需要遵循以下三个简单步骤:
- 首先,我们创建一个目录,并给它一个包名,最好与它的操作相关。
- 然后我们将类和所需的函数放入其中。
- 最后我们在目录中创建一个 __init__.py 文件,让Python知道该目录是一个包。
创建包示例
让我们看一下这个例子,看看一个包是如何创建的。让我们创建一个名为 Cars 的包,并在其中构建三个模块,即 Bmw、Audi 和 Nissan。
- 首先,我们创建一个目录并将其命名为 Cars。
- 然后我们需要创建模块。为此,我们需要创建一个名为 Bmw.py 的文件,并通过将这段代码放入其中来创建其内容。
# Python code to illustrate the Modules class Bmw: # First we create a constructor for this class # and add members to it, here models def __init__(self): self.models = ['i8', 'x1', 'x5', 'x6'] # A normal print function def outModels(self): print('These are the available models for BMW') for model in self.models: print('\t%s ' % model)
然后我们创建另一个名为 Audi.py 的文件,并向其中添加具有不同成员的相似类型的代码。
# Python code to illustrate the Module class Audi: # First we create a constructor for this class # and add members to it, here models def __init__(self): self.models = ['q7', 'a6', 'a8', 'a3'] # A normal print function def outModels(self): print('These are the available models for Audi') for model in self.models: print('\t%s ' % model)
然后我们创建另一个名称为 Nissan.py 的文件,并向其中添加具有不同成员的相似类型的代码。
# Python code to illustrate the Module class Nissan: # First we create a constructor for this class # and add members to it, here models def __init__(self): self.models = ['altima', '370z', 'cube', 'rogue'] # A normal print function def outModels(self): print('These are the available models for Nissan') for model in self.models: print('\t%s ' % model)
- 最后我们创建 __init__.py 文件。这个文件将放在 Cars 目录中,可以留空,或者我们可以将这个初始化代码放入其中。
from Bmw import Bmw from Audi import Audi from Nissan import Nissan
现在,让我们使用我们创建的包。为此,在 Cars 包所在的同一目录中创建一个 sample.py 文件,并向其中添加以下代码:
# Import classes from your brand new package from Cars import Bmw from Cars import Audi from Cars import Nissan # Create an object of Bmw class & call its method ModBMW = Bmw() ModBMW.outModels() # Create an object of Audi class & call its method ModAudi = Audi() ModAudi.outModels() # Create an object of Nissan class & call its method ModNissan = Nissan() ModNissan.outModels()
访问软件包的各种方式
让我们看一下这个例子,并尝试将包与它相关联,以及我们如何访问它。
- 在包中导入
假设汽车和品牌目录是包。为了使它们成为一个包,它们都必须包含 __init__.py 文件,可以是空白的,也可以是一些初始化代码。让我们假设汽车的所有模型都是模块。使用包有助于单独或整体导入任何模块。
假设我们想要获得 Bmw i8。其语法为:'import' Cars.Bmw.x5
在导入一个或多个子包或模块时, Python会搜索整个目录树以查找特定的包,并按照点运算符的编程系统地进行。
如果任何模块包含一个函数并且我们想要导入它。例如,a8 有一个函数get_buy(1),我们想导入它,语法是:import Cars.Audi.a8 Cars.Audi.a8.get_buy(1)
仅使用导入语法时,必须记住最后一个属性必须是子包或模块,它不应该是任何函数或类名。
- 包中的“来自...导入”
现在,每当我们需要使用这样的函数时,我们都需要在导入父包后编写整行。为了以更简单的方式解决这个问题,我们使用“from”关键字。为此,我们首先需要使用 'from' 和 'import' 引入模块:from Cars.Audi import a8
现在我们函数在任何地方使用
a8.get_buy(1)
还有另一种不那么冗长的方式。我们可以直接导入函数并在需要的地方使用它。首先使用以下方式导入它:
from Cars.Audi.a8 import get_buy
现在从任何地方调用该函数:
get_buy(1)
- '从...导入 *' 在包中
在使用from...import语法时,我们可以将任何东西从子模块导入到类、函数或变量,在同一个模块中定义。如果包中未定义导入部分中提到的属性,则编译器会抛出 ImportError 异常。
导入子模块可能会导致在显式导入子模块时发生不需要的副作用。因此,我们可以使用 * 语法一次导入多个模块。语法是:from Cars.Chevrolet import *
这将从子包中导入所有内容,即模块、子模块、函数、类。
- 在包中导入