Python 模块和 Python 包有什么区别?


在 Python 中,模块和包都用于组织和构建代码,但它们的服务目的略有不同。

Python 模块是一个包含 Python 代码的单个文件,可以导入并在其他 Python 代码中使用。模块可以定义变量、函数、类和其他 Python 结构,这些结构可以被其他代码使用。模块是组织代码并使其可在多个程序中重复使用的好方法。

另一方面,Python 包是相关 Python 模块的集合,这些模块在一个目录层次结构中组织。一个包可以包含一个或多个模块,还可以包含其他子包。包用于组织更大的代码库并避免具有相同名称的模块之间的命名冲突。

以下是一些代码示例,用于说明模块和包之间的区别

创建 Python 模块

示例

假设我们有一个名为 my_module.py 的文件,其中包含以下代码

# my_module.py
def hello_world():
    print("Hello, world!")

我们可以通过导入它在另一个 Python 脚本中使用此模块

# main.py
import my_module
my_module.hello_world()

当我们运行 main.py 时,它将打印“Hello, world!”。在这种情况下,my_module 是一个模块。

~$python main.py

输出

Hello, world!

创建 Python 包

现在假设我们想创建一个包含多个模块的包。我们将从创建一个名为 my_package 的目录开始,其结构如下:

示例

my_package/
├── __init__.py
└── my_module.py

__init__.py 文件是使 my_package 成为包所必需的。它可以为空,也可以包含包的初始化代码。

我们可以将我们的 hello_world 函数放在 my_module.py 中

# my_package/my_module.py
def hello_world():
    print("Hello, world!")

然后我们可以通过导入模块在另一个 Python 脚本中使用此包

# main.py
from my_package import my_module
my_module.hello_world()

当我们运行 main.py 时,它将打印 Hello, world!。在这种情况下,my_package 是一个包,my_module 是包中的一个模块。

~$python main.py

输出

Hello world!

创建嵌套 Python 包

我们还可以通过将模块组织到子目录中来创建嵌套包。例如,让我们在 my_package 中创建一个名为 utils 的子目录,其结构如下:

示例

my_package/
├── __init__.py
├── my_module.py
└── utils
    ├── __init__.py
    └── math_utils.py

__init__.py 文件再次是使 utils 成为子包所必需的。

我们可以将一些实用函数放在 math_utils.py 中

# my_package/utils/math_utils.py

def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

然后我们可以通过导入嵌套模块在另一个 Python 脚本中使用这些实用程序

# main.py
from my_package import my_module
from my_package.utils import math_utils
my_module.hello_world()
result = math_utils.add(2, 3)
print(result)
result = math_utils.multiply(4, 5)
print(result)

当我们运行 main.py 时,它将打印 Hello, world!、5 和 20。在这种情况下,utils 是 my_package 中的子包,math_utils 是子包中的一个模块。

~$python main.py

输出

Hello, world
5
20

一个模块是单个的 Python 代码文件,可以导入并在其他 Python 程序中使用。这是一个模块的示例

示例

#my_module.py

def hello(name):
    print(f"Hello, {name}!")

def goodbye(name):
    print(f"Goodbye, {name}!")

你可以在另一个 Python 程序中像这样使用这个模块

import my_module
my_module.hello("Alice")  
my_module.goodbye("Bob")   

输出

"Hello, Alice!"
"Goodbye, Bob!"

另一方面,是模块的集合,这些模块在一个目录层次结构中组织。这是一个包的示例

示例

my_package/
├── __init__.py
├── module1.py
└── module2.py

__init__.py 文件是将目录标记为 Python 包所必需的。以下是 module1.py 和 module2.py 文件可能包含的内容

#module1.py
def add(a, b):
    return a + b

#module2.py
def subtract(a, b):
    return a – b

你可以在另一个 Python 程序中像这样使用这些模块

import my_package.module1
import my_package.module2
print(my_package.module1.add(2, 3))       
print(my_package.module2.subtract(5, 2))  

输出

5
3

另一种从包中导入所有模块的方法是使用 from ... import * 语法。例如

示例

from my_package import *

print(module1.add(2, 3))       
print(module2.subtract(5, 2))  

输出

5
3

这将从 my_package 包中导入所有模块到当前命名空间。但是,此语法有时会导致命名冲突,应谨慎使用。

更新于:2023年8月11日

2K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.