公司动态
Python 模块与包学习笔记
1. 引言在 Python 开发中随着项目规模的增长把所有代码写在一个文件里会变得难以维护。模块Module和包Package是 Python 组织代码、实现代码复用的核心机制。本笔记将系统梳理模块与包的概念、导入方式、常见用法及注意事项帮助你建立清晰的知识框架。2. 模块Module2.1 什么是模块模块就是一个包含 Python 代码的.py文件。一个模块可以包含函数、类、变量以及可执行的代码。通过将相关功能封装在模块中可以实现代码的复用和逻辑的清晰划分。2.2 模块的导入方式Python 提供了多种导入模块的方式常用的有以下几种#全局导入# 方式一直接导入整个模块importmathprint(math.sqrt(16))# 4.0# 方式二给模块起别名importmathasmprint(m.floor(3.7))# 3#局部导入# 方式一导入模块中的特定成员frommathimportsqrtprint(sqrt(25))# 5.0# 方式二导入多个成员frommathimportsqrt,piprint(sqrt(9),pi)# 3.0 3.141592653589793# 方式三给成员起别名frommathimportsqrtassquare_rootprint(square_root(36))# 6.0# 方式四import *# 导入模块中所有不以下划线开头的成员直接通过成员名的方式访问。pythonfrom模块名import*全局导入访问方式模块名.成员局部导入访问方式成员名2.3 模块搜索路径当使用import语句导入模块时Python 解释器会按照以下顺序查找模块当前脚本所在目录PYTHONPATH环境变量中指定的路径Python 安装目录下的标准库路径可以通过以下代码查看当前的模块搜索路径importsysforpathinsys.path:print(path)2.4if __name__ __main__的作用这是一个非常实用的技巧用于区分模块是被直接运行还是被导入# my_module.pydefgreet(name):returnfHello,{name}!if__name____main__:# 只有直接运行该文件时才会执行以下代码print(greet(Python))当直接运行my_module.py时__name__的值为__main__会执行测试代码当被其他模块导入时__name__的值为模块名测试代码不会执行。-------可以避免模块的测试代码被执行2.5__all__使用from import *导入模块时可以在被导入的模块中使用__all__设置哪些内容可以被导入。__all__的设置只针对使用from import *导入模块时有效。在被导入的文件中设置__all__列表形式在my_add.py中向__all__添加部分元素__all__[num,add,_str1]#内容必须要用引号引起来num100num1200_str1abcdefadd(a,b):求两个数的和returna在main.py中使用from my_add import *导入模块中的内容。没在__all__中的变量在使用时会报错在__all__中定义的所有变量都可以使用包括以但下划线开头的成员frommy_addimport*print(add(1,2))print(num)print(_str1)print(num1)# NameError: name num1 is not defined2.6 dir()dir()是一个内置函数主要用于列出对象的属性和方法或者列出当前作用域中定义的名称并以一个字符串列表的形式返回。当你将一个模块作为dir()的参数时它会返回该模块中定义的名称列表包括函数、类、变量等importmath#查看math模块下的print(dir(math))当你将一个对象作为dir()的参数时它会返回该对象的属性和方法列表。classMyClass:def__init__(self):self.x1self.y2defmethod1(self):passobjMyClass()print(dir(obj))当你不传递任何参数调用dir()时它会列出当前作用域中定义的名称包括变量、函数、类等defmy_function():passvariable10print(dir())3. 包Package3.1 什么是包包是一种通过目录结构来组织多个模块的方式。一个包含__init__.py文件的目录就是一个包。包可以嵌套形成层级结构。my_package/ ├── __init__.py ├── module_a.py ├── module_b.py └── sub_package/ ├── __init__.py └── module_c.py3.2 创建包创建包非常简单只需按照以下步骤创建一个目录作为包名在目录中创建__init__.py文件可以为空也可以包含初始化代码在目录中添加模块文件# my_package/__init__.pyprint(正在初始化 my_package)# my_package/module_a.pydeffunc_a():returnFunction A3.3 导入包中的模块# 导入包中的指定模块importmy_package.module_a[as别名]print(my_package.module_a.func_a())print(别名.func_a())# 从包中导入模块frommy_packageimportmodule_aprint(module_a.func_a())# 从包中导入模块中的成员frommy_package.module_aimportfunc_aprint(func_a())3.4__init__.py的作用__init__.py文件是包的初始化文件主要有以下作用标识目录为 Python 包在包被导入时执行初始化代码通过__all__控制from package import *的导入范围# my_package/__init__.py__all__[module_a]# 只允许导入 module_a4. 常用内置模块Python 标准库提供了大量实用的内置模块以下是几个常用的# os 模块操作系统接口importosprint(os.getcwd())# 获取当前工作目录# sys 模块系统相关功能importsysprint(sys.version)# Python 版本# datetime 模块日期时间处理fromdatetimeimportdatetime nowdatetime.now()print(now.strftime(%Y-%m-%d %H:%M:%S))# json 模块JSON 数据处理importjson data{name:Python,version:3.12}json_strjson.dumps(data)print(json_str)# {name: Python, version: 3.12}5. 第三方模块的安装与使用5.1 使用 pip 安装pip默认的源是Python Package IndexPyPI其地址为https://pypi.org/simple/如果下载比较慢还可以指定其它的源阿里云http://mirrors.aliyun.com/pypi/simple/豆瓣http://pypi.douban.com/simple/清华大学https://pypi.tuna.tsinghua.edu.cn/simple/# 安装第三方模块pipinstallrequests# 安装指定版本pipinstallrequests2.31.0# 升级模块pipinstall--upgraderequests# 卸载模块pip uninstall requests# 永久修改下载源pip configsetglobal.index-url https://mirrors.aliyun.com/pypi/simple/# 临时使用其他源pipinstall-ihttps://mirrors.aliyun.com/pypi/simple/包名通过cmd下载的包在python安装目录下的lib通过Pycharm安装我们选择的解释器类型每个项目独立的所以是将第三方包安装在当前项目环境下例如D:\dev\workspace\python-2025.venv\Lib\site-packages5.2 使用第三方模块# 安装后即可像标准库一样导入使用importrequests responserequests.get(https://api.github.com)print(response.status_code)# 2005.3 打包并安装自己的包1先安装setuptools库如 果 不 安 装setuptools库 后 续 打 包 时 可 能 会 遇 到 报 错ModuleNotFoundError: Nomodule named ‘distutils’所以可以提前安装setuptools库。在命令提示符中执行如下命令pipinstallsetuptools2在包外创建一个setup.py文件内容如下fromdistutils.coreimportsetup setup(namegraphic,#需要打包的名字version1.0,#版本py_modules[graphic.circle,graphic.rectangle],#需要打包的模块)3在setup.py同级目录下进行构建打成压缩包python setup.py sdidt4pip命令安装自己打的库pipinstallpath_to_your_package/dist/your_package_name-0.1.tar.gz5Pycharm安装自己打的包库管理软件包添加搜索包安装6. 模块与包的常见问题6.1 循环导入当两个模块相互导入时会发生循环导入导致ImportError。解决方法将公共代码提取到第三个模块中在函数内部延迟导入调整导入顺序# 避免循环导入在函数内部导入defuse_module_b():frommodule_bimportfunc_breturnfunc_b()6.2 相对导入在包内部可以使用相对导入来引用同级或上级模块# 同级模块导入from.importmodule_a# 上级包导入from..importparent_module# 同级模块中的成员导入from.module_aimportfunc_a注意相对导入只能在包内部使用直接运行包内的模块文件会报错。6.3 模块缓存Python 会缓存已导入的模块重复导入不会重复执行模块代码。可以通过sys.modules查看已加载的模块importsysprint(mathinsys.modules)# 导入 math 后为 True7. 总结模块和包是 Python 组织代码的重要机制掌握它们能够帮助你将代码按功能拆分提高可维护性实现代码复用避免重复编写合理组织项目结构便于团队协作灵活使用标准库和第三方库提升开发效率建议在实际项目中多实践逐步体会模块化设计带来的好处。