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

八、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.lqws.cn/news/166681.html

相关文章:

  • QT中使用libcurl库实现到ftp服务器的上传和下载
  • C语言 — 编译和链接
  • 体制内 AI写作:推荐材料星 AI文章修改润色
  • 11. vue pinia 和react redux、jotai对比
  • 互联网大厂Java求职面试:AI与大模型技术在企业知识库中的深度应用
  • minimatch 详解:功能、语法与应用场景
  • uniapp+vue3实现CK通信协议(基于jjc-tcpTools)
  • IDEA 包分层显示设置
  • BT Panel密码修改
  • 【Redis】类型补充
  • ROS2--导航仿真
  • sumatraPDF设置深色界面
  • YOLOv11 | 注意力机制篇 | 可变形大核注意力Deformable-LKA与C2PSA机制
  • JTAG与SWD的功能辩解有和相关
  • Mysql主从复制原理分析
  • 缓解停车难:4G地磁如何重构车位分配?
  • proteus8安装教程
  • CppCon 2015 学习:C++ Metaprogrammin
  • 【虚拟机版本号】如果忘记了版本号,这样查找版本号
  • C++虚函数表(虚表Virtual Table,简称vtable、VFT)(编译器为支持运行时多态(动态绑定)而自动生成的一种内部数据结构)虚函数指针vptr
  • 【如何做好应用架构?】
  • YOLOv11 | 注意力机制篇 | 混合局部通道注意力MLCA与C2PSA机制
  • CMake指令:add_definitions
  • 06.最长连续序列
  • 是否存在路径(FIFOBB算法)
  • Java-IO流之缓冲流详解
  • 实现基于Yolo的异常聚集算法
  • 经典算法:回文链表
  • 计算机操作系统知识点总结④【完】
  • 2025年渗透测试面试题总结-ali 春招内推电话1面(题目+回答)