📜  创建和访问Python包

📅  最后修改于: 2022-05-13 01:55:32.747000             🧑  作者: Mango

创建和访问Python包


包是一种结构化许多包和模块的方法,它有助于组织良好的数据集层次结构,使目录和模块易于访问。就像操作系统中有不同的驱动器和文件夹来帮助我们存储文件一样,包也帮助我们存储其他子包和模块,以便用户在需要时使用。

创建和探索包

为了告诉Python一个特定的目录是一个包,我们在其中创建一个名为 __init__.py 的文件,然后将其视为一个包,我们可以在其中创建其他模块和子包。这个 __init__.py 文件可以留空,也可以使用包的初始化代码进行编码。
要在Python中创建包,我们需要遵循以下三个简单步骤:

  1. 首先,我们创建一个目录,并给它一个包名,最好与它的操作相关。
  2. 然后我们将类和所需的函数放入其中。
  3. 最后我们在目录中创建一个 __init__.py 文件,让Python知道该目录是一个包。

创建包示例

让我们看一下这个例子,看看一个包是如何创建的。让我们创建一个名为 Cars 的包,并在其中构建三个模块,即 Bmw、Audi 和 Nissan。

  1. 首先,我们创建一个目录并将其命名为 Cars。
  2. 然后我们需要创建模块。为此,我们需要创建一个名为 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)
    
  3. 最后我们创建 __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()
    

    访问软件包的各种方式

    让我们看一下这个例子,并尝试将包与它相关联,以及我们如何访问它。

    1. 在包中导入
      假设汽车和品牌目录是包。为了使它们成为一个包,它们都必须包含 __init__.py 文件,可以是空白的,也可以是一些初始化代码。让我们假设汽车的所有模型都是模块。使用包有助于单独或整体导入任何模块。
      假设我们想要获得 Bmw i8。其语法为:
      'import' Cars.Bmw.x5 

      在导入一个或多个子包或模块时, Python会搜索整个目录树以查找特定的包,并按照点运算符的编程系统地进行。
      如果任何模块包含一个函数并且我们想要导入它。例如,a8 有一个函数get_buy(1),我们想导入它,语法是:

      import Cars.Audi.a8
      Cars.Audi.a8.get_buy(1)
      

      仅使用导入语法时,必须记住最后一个属性必须是子包或模块,它不应该是任何函数或类名。

    2. 包中的“来自...导入”
      现在,每当我们需要使用这样的函数时,我们都需要在导入父包后编写整行。为了以更简单的方式解决这个问题,我们使用“from”关键字。为此,我们首先需要使用 'from' 和 'import' 引入模块:
      from Cars.Audi import a8

      现在我们函数在任何地方使用

      a8.get_buy(1)

      还有另一种不那么冗长的方式。我们可以直接导入函数并在需要的地方使用它。首先使用以下方式导入它:

      from Cars.Audi.a8 import get_buy

      现在从任何地方调用该函数:

      get_buy(1)
    3. '从...导入 *' 在包中
      在使用from...import语法时,我们可以将任何东西从子模块导入到类、函数或变量,在同一个模块中定义。如果包中未定义导入部分中提到的属性,则编译器会抛出 ImportError 异常。
      导入子模块可能会导致在显式导入子模块时发生不需要的副作用。因此,我们可以使用 * 语法一次导入多个模块。语法是:
      from Cars.Chevrolet import *

      这将从子包中导入所有内容,即模块、子模块、函数、类。