包(Package)是 Python 中组织模块的基本单元,可以将多个模块组织在一个目录下,形成一个包。包是一种有层次结构的模块命名空间,可以更好地组织和管理模块。
包和模块的关系就像文件夹和文件的关系,包是一个文件夹,里面包含了多个模块,可以通过 .
来访问包中的模块。
- 模块:一个 Python 文件,包含了定义和实现代码,可以被其他 Python 程序导入使用。
- 包:一个包含
__init__.py
文件的目录,里面可以包含多个模块或子包,提供了模块的层级组织结构。
比如下面这个目录结构就是一个包的示例:
mypackage/ ├── __init__.py ├── module1.py ├── module2.py └── subpackage/ ├── __init__.py ├── submodule1.py └── submodule2.py
mypackage
是包,module1.py
、module2.py
是包中的模块。subpackage
是mypackage
的子包,包含submodule1.py
、submodule2.py
两个子模块。
创建和使用包与模块
通过创建包含 __init__.py
的目录,并在其中放置模块,可以创建包。然后我们就可以使用 import
导入包和模块。
创建包
首先我们创建一个名为 mypackage
的文件夹,然后需要注意的是需要在文件夹中创建一个名为 __init__.py
的文件,这个文件是包的标识,可以为空文件。
mypackage/ └── __init__.py
然后就可以在 mypackage
文件夹中创建模块,比如 module1.py
和 module2.py
。
# mypackage/module1.py def func1(): return "Function 1 from Module 1" # =========== # mypackage/module2.py def func2(): return "Function 2 from Module 2"
现在我们就成功创建了一个包 mypackage
,包含了两个模块 module1
和 module2
。
# 目录结构 mypackage/ ├── __init__.py ├── module1.py └── module2.py
导入包和模块
上面我们已经创建了一个包 mypackage
,包含了两个模块 module1
和 module2
,现在我们可以在其他 Python 文件中导入这个包和模块。
# main.py from mypackage import module1, module2 print(module1.func1()) # 输出: Function 1 from Module 1 print(module2.func2()) # 输出: Function 2 from Module 2
这里我们是有 from mypackage import module1, module2
导入了 mypackage
包中的 module1
和 module2
两个模块,然后就可以调用这两个模块中的函数了。
是不是很简单,使用方式上和导入模块是一样的,只不过多了一个包名。
包的嵌套和子包
另外包还可以嵌套子包,通过层级结构组织更复杂的代码。子包是包的子目录,同样里面包含 __init__.py
文件及其他模块或子包。比如我们可以在 mypackage
包中创建一个名为 subpackage
的子包,然后在子包中创建模块,如下所示:
mypackage/ ├── __init__.py ├── module1.py └── subpackage/ ├── __init__.py └── submodule1.py
然后我们就可以在子包中创建模块 submodule1.py
,并在其中定义函数。
# mypackage/subpackage/submodule1.py def func3(): return "Function 3 from Submodule 1"
接下来我们就可以在其他 Python 文件中导入子包和子模块,如下所示:
# main.py from mypackage.subpackage import submodule1 print(submodule1.func3()) # 输出: Function 3 from Submodule 1
在上面代码重我们通过 from mypackage.subpackage import submodule1
导入了 mypackage
包中的 subpackage
子包中的 submodule1
模块,然后就可以调用这个模块中的函数了。
__init__.py
文件
我们说在 Python 中在一个目录中包含 __init__.py
文件,这个目录就会被视为一个包,通常 __init__.py
文件是空文件,但是也可以包含包的初始化代码、公开的模块等。
比如我们可以在 __init__.py
文件中导入包中的模块或函数之类的,使得在导入包时可以直接使用,如下所示:
# mypackage/__init__.py from .module1 import func1 from .module2 import func2
这样我们在导入 mypackage
包时就可以直接使用 func1
和 func2
函数了。
# main.py from mypackage import func1, func2 print(func1()) # 输出: Function 1 from Module 1 print(func2()) # 输出: Function 2 from Module 2
因为我们在 __init__.py
中可以导入了包中模块的函数,使得在导入包时可以直接使用包的公共接口。
模块和包的实际应用
模块和包用于组织大型项目代码、开发可重用库、实现层级结构等。对于大型项目,可以将代码分解为多个模块和包,便于组织和维护,所以包和模块的使用是 Python 编程中的重要部分,也是必须掌握的知识。
# 大型项目 project/ ├── main.py ├── config/ │ ├── __init__.py │ └── settings.py ├── core/ │ ├── __init__.py │ └── engine.py └── utils/ ├── __init__.py └── helpers.py
开发可重用库
有的时候我们会将一些常用的功能或者 API 封装成库,然后通过包和模块的方式提供给其他项目使用。
# 可重用库 my_library/ ├── __init__.py ├── math_operations.py └── string_operations.py
这样可以大大提高代码的复用性,减少重复开发的工作量。
模块和包的管理与分发
当我们开发了一个包后,我们可以使用 pip
管理和分发包,也可以将它们发布到 PyPI 供其他开发者使用。比如我们需要使用到 requests
这个库,我们可以通过 pip
安装:
pip install requests
这个库其实就是一个包,通过 pip
安装后就可以在我们的项目中使用了。