当前位置: 首页 > article >正文

八、Python模块、包

目录

1. 模块

1.1 什么是模块?

1.2 创建模块

1.3 导入模块

1.4 模块的命名空间

1.5 模块的搜索路径

1.6 模块的重新加载

2. 包

2.1 什么是包?

2.2 创建包

2.3 导入包中的模块

2.4 包的层次结构

3. 模块和包的管理

3.1 安装模块

3.2 卸载模块

3.3 列出已安装的模块

4. 模块和包的最佳实践

4.1 模块命名

4.2 包结构

4.3 避免循环导入

4.4使用 __all__ 控制公开接口


1. 模块

1.1 什么是模块?

一个模块是一个包含 Python 定义和语句的文件。模块的文件名以 .py 结尾。通过将代码组织到模块中,可以实现代码的复用和更好的结构化管理。

1.2 创建模块

要创建一个模块,只需在一个文件中编写 Python 代码并保存为 .py 文件。

示例:创建一个模块 mymodule.py

# 定义一个函数
def greet(name):print(f"Hello, {name}!")# 定义一个变量
version = "1.0.0"# 定义一个类
class Calculator:def add(self, a, b):return a + bdef subtract(self, a, b):return a - b

1.3 导入模块

可以使用 import 语句导入模块,并使用模块中的函数、变量和类。

示例:导入并使用 mymodule

import mymodule# 使用模块中的函数
mymodule.greet("Alice")# 使用模块中的变量
print(mymodule.version)# 使用模块中的类
calc = mymodule.Calculator()
print(calc.add(5, 3))  # 输出:8

1.4 模块的命名空间

每个模块都有自己的命名空间,这避免了名称冲突。模块中的变量、函数和类不会与导入模块的命名空间冲突。

1.5 模块的搜索路径

当你导入一个模块时,Python 会在以下位置按顺序查找模块:

  1. 当前工作目录。

  2. PYTHONPATH 环境变量指定的目录。

  3. Python 安装目录中的默认路径。

可以通过 sys.path 查看模块搜索路径:

import sys
print(sys.path)

1.6 模块的重新加载

一旦模块被导入,它就不会再次加载。如果需要重新加载模块,可以使用 importlib.reload()

示例:重新加载模块

import importlib
import mymodule# 修改 mymodule 后重新加载
importlib.reload(mymodule)

2. 

2.1 什么是包?

包是一种包含多个模块的文件夹,用于组织模块的层次结构。包必须包含一个 __init__.py 文件(可以为空),以标识这是一个包。

2.2 创建包

要创建一个包,只需创建一个文件夹,并在其中添加 __init__.py 文件和其他模块文件。

示例:创建包 mypackage

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

__init__.py 的内容

# 可以在 __init__.py 中初始化包或定义包级别的变量
print("Package initialized.")

module1.py 的内容

def func1():print("Function 1 from module1.")

module2.py 的内容

def func2():print("Function 2 from module2.")

2.3 导入包中的模块

可以使用 import 语句导入包中的模块。

示例:导入并使用包中的模块

# 导入整个包
import mypackage# 导入包中的特定模块
import mypackage.module1
import mypackage.module2# 使用模块中的函数
mypackage.module1.func1()
mypackage.module2.func2()

或使用 from ... import ... 语法

from mypackage import module1, module2module1.func1()
module2.func2()

或直接导入函数

from mypackage.module1 import func1
from mypackage.module2 import func2func1()
func2()

2.4 包的层次结构

可以创建嵌套的包结构,以实现更复杂的层次组织。

示例:创建嵌套包

mypackage/
├── __init__.py
├── submodule/
│   ├── __init__.py
│   ├── submodule1.py
└── module1.py

导入嵌套包中的模块

from mypackage.submodule.submodule1 import func

3. 模块和包的管理

3.1 安装模块

可以使用 pip 安装第三方模块。

示例:安装 requests 模块

pip install requests

3.2 卸载模块

可以使用 pip 卸载已安装的模块。

示例:卸载 requests 模块

pip uninstall requests

3.3 列出已安装的模块

可以使用 pip list 查看已安装的模块。

pip list

4. 模块和包的最佳实践

4.1 模块命名

模块名应简洁明了,避免使用保留字和内置函数名。

4.2 包结构

合理设计包的结构,避免过深的嵌套。包的层次结构应反映项目的逻辑结构。

4.3 避免循环导入

循环导入(即两个模块互相导入)会导致错误,应尽量避免。

4.4使用 __all__ 控制公开接口

可以在模块中定义 __all__ 列表,指定哪些名称会被 from module import * 导入。

示例:定义 __all__

__all__ = ["func1", "func2"]
http://www.lryc.cn/news/2401719.html

相关文章:

  • 使用交叉编译工具提示stubs-32.h:7:11: fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法
  • macOS 连接 Docker 运行 postgres,使用navicat添加并关联数据库
  • 指针的使用——基本数据类型、数组、结构体
  • TK海外抢单源码/指定卡单
  • Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法
  • 【Linux】Linux 环境变量
  • OpenCV在图像上绘制文字示例
  • Java 抗量子算法:构建后量子时代的安全基石
  • Kubernetes 集群到 Jumpserver
  • Android7 Input(十)View 处理Input事件pipeline
  • 图像数据如何表示为概率单纯形
  • (11)Service Mesh架构下Java应用实现零信任安全模型
  • 什么是内网映射?如何将内网ip映射到外网访问?
  • 为什么要选择VR看房?VR看房有什么优点?
  • linux 串口调试命令 stty
  • C++STL-vector的使用
  • 图简记。。
  • pytorch基本运算-范数
  • uefi协议设计目的
  • springcloud openfeign 偶现 Caused by: java.net.UnknownHostException
  • Transformer实战——词嵌入技术详解
  • [pdf、epub]300道《软件方法》强化自测题业务建模需求分析共257页(202505更新)
  • Vue3入门指南:从零到精通的快速上手
  • 前端常见错误
  • 吴恩达MCP课程(5):mcp_chatbot_prompt_resource.py
  • 关于DDOS
  • 云服务器自带的防御可靠吗
  • Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
  • 设计模式——抽象工厂设计模式(创建型)
  • 基于LocalAI与cpolar技术协同的本地化AI模型部署与远程访问方案解析