包思维导图

定义: 包是一种组织和管理Python模块的方式,它本质上是一个包含__init__.py文件的目录。
层次化管理模块,避免命名冲突。
提高代码的可重用性和可维护性。
方便模块的导入和使用。
作用:
1.1 什么是包?
包的标识: 存在__init__.py文件的目录才会被Python视为包。
初始化: 用于初始化包,可以定义包级别的变量、函数和类。
控制导入行为: 可以通过__all__变量控制包中哪些模块或对象可以被 from package import * 导入。
1.2 __init__.py文件的作用
模块: 单个.py文件,包含函数、类、变量等。
包: 一个包含__init__.py文件的目录,可以包含多个模块和其他子包。
1.3 包与模块的区别
一、包的定义与概念
1. 创建一个目录,作为包的根目录。
2. 在该目录下创建一个名为__init__.py的文件(可以为空)。
3. 将相关的模块(.py文件)放入该目录。
4. 可以创建子包(嵌套的目录,每个子包也需要包含__init__.py文件)。
2.1 创建包的步骤
my_package: 包的根目录。
module1.py, module2.py: 包中的模块。
sub_package: 子包。
module3.py: 子包中的模块。
2.2 包的组织结构示例

作用: 定义当使用from package import *语句时,哪些模块或对象应该被导入。

示例:my_package/__init__.py 中:

python
all = ['module1', 'module2']

这意味着from my_package import * 将只导入module1module2

2.3 __all__变量的使用
二、包的创建与组织
import package 导入整个包,需要通过 package.module 访问模块。
import package.module 导入包中的某个模块,需要通过 package.module.function 访问模块中的函数。
from package import module 从包中导入某个模块,可以直接使用 module.function 访问模块中的函数。
from package.module import function 从包中的某个模块导入特定的函数,可以直接使用 function
from package import * 导入包中所有在__all__变量中定义的模块或对象 (谨慎使用,可能导致命名冲突)。
3.1 导入包的方式

绝对导入: 使用完整的包名和模块名进行导入,例如 import my_package.sub_package.module3

from . import module4 (同一目录下)
from .. import module1 (上一级目录)
from ..my_package import module1 (根目录,不推荐)

相对导入: 在包内部使用相对路径进行导入,例如在sub_package/module3.py中:

相对导入使代码更简洁,尤其是在包的内部。
避免硬编码包名,提高代码的可移植性。

优点:

注意: 相对导入只能在包内部使用。

3.2 相对导入与绝对导入
每个包都有自己的命名空间,可以防止不同包中的模块命名冲突。
访问包中的对象需要使用完整的路径,例如 my_package.module1.my_function()
3.3 包的命名空间
三、包的导入与使用
定义: 允许将一个包分布在多个目录中,每个目录提供一部分模块。
不需要__init__.py文件 (或包含 __path__ = __import__('pkgutil').extend_path(__path__, __name__))。
模块可以在不同的位置,Python会自动合并它们。
特点:
大型项目,需要将模块分散在不同的目录或仓库中。
插件式架构,允许动态添加新的模块。
用途:
4.1 命名空间包 (Namespace Packages)
pkgutil.walk_packages():递归地遍历包及其子包,返回所有模块的名称。
pkgutil.iter_modules():迭代包中的模块。
pkgutil 提供了一些工具函数,用于浏览和导入包中的模块。
importlib.import_module():动态地导入一个模块,可以根据字符串指定的模块名进行导入。
importlib 提供了动态导入模块的能力。
4.2 使用pkgutilimportlib模块
将数据文件放入包中: 可以将数据文件(例如配置文件、图像文件)与包一起发布。
访问数据文件: 使用 pkgutil.get_data()importlib.resources 从包中读取数据文件。
4.3 数据文件和资源文件
四、包的高级应用
保持包的目录结构清晰,模块和子包的命名应该具有描述性。
避免过度嵌套的目录结构,保持层级简单。
5.1 清晰的目录结构
避免在__init__.py文件中放置过多的代码,只用于初始化包或控制导入行为。
使用__all__变量明确指定哪些模块可以被 from package import * 导入。
5.2 合理使用__init__.py
为包、模块、类和函数编写清晰的文档字符串,方便用户理解和使用。
使用 Sphinx 等工具自动生成文档。
5.3 使用文档字符串
使用版本控制系统(例如 Git)管理包的代码。
使用 PyPI (Python Package Index) 发布包,方便其他用户安装和使用。
使用 setuptoolspoetry 等工具管理包的依赖项和元数据。
5.4 版本控制与发布
避免包内部出现循环导入的情况,这会导致程序运行错误。
可以通过重新组织代码或使用动态导入来解决循环导入问题。
5.5 避免循环导入
五、包的最佳实践
《包思维导图》
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
上一个主题: 西游记思维导图 下一个主题: 阳阳思维导图

相关思维导图推荐

分享思维导图