
01
引言
简单地说,模块就是Python中的文件。它也用于重用项目中的逻辑。虽然模块的定义很简单,但当我们在程序中导入任何模块时,后台都会发生很多事情。了解这些概念有助于我们决定如何为项目编写高效的代码。
闲话少说,我们直接开始吧!
02
为什么使用模块?
模块常用于将我们的代码组织到不同的文件中。在大型项目中,模块尤其有用。以下是使用模块的一些重要原因。
代码重用性:重用代码的最佳方法是将代码编写成小的模块,并导入到不同的地方。
-
代码可维护性:对于大型项目来说,将逻辑分成不同的模块始终是一个好的做法。这有助于我们长期维护代码。 -
避免冲突:每当我们导入任何模块时,它都会自动创建一个命名空间,这是代码的逻辑分隔。它有助于避免两个不同模块中相同变量或方法名称之间的冲突。
Python中基本上可以概括,共有两种类型的模块:
-
内置模块 - 安装Python时默认捆绑的Python文件 -
用户模块 - 用户为代码共享而创建的 Python 文件。
03
举个栗子
讲了这么多文字,一定很枯燥吧。接着让我们创建一个非常简单的模块示例。
.├── main.py└── service.py
在本例中,我们的 main.py 脚本将导入 service.py 模块。代码如下:
import serviceif __name__ == "__main__":print(service.get_users())
接着让我们来分析这个简单的语句import service在幕后是如何工作的。
04
定位模块
当在代码中的import语句执行后,首先要做的就是在不同的位置(称为模块搜索路径)寻找对应模块。这些可能的寻找位置如下:
-
Current directory: 当前文件所在目录。Python将首先在当前项目根目录下搜索模块。 -
PYTHONPATH: 该环境变量有助于扩展模块搜索路径,并允许用户添加自己的自定义路径。 -
Standard library directories:这是安装所有标准库模块的位置。 -
Third-Party Extensions Path: 这是安装第三方库的位置(/lib/site-packages);它会自动添加到模块搜索路径中。
所有这些路径都存储在系统库路径中,我们可以通过打印 sys.path 的结果看到这一点。
05
编译
在模块搜索路径中找到模块后,Python会将其编译成字节码,然后保存在 __pycache__ 文件夹中。下面是编译后的文件夹结构:
.├── __pycache__│ └── service.cpython-312.pyc├── main.py└── service.py
可以看到,这里多出了一个名为__pycache__ 的文件夹,文件名是 service.cpython-312.pyc。这里,数字312代表编译模块时使用的Python版本(python3.12)。
06
运行
在import操作的最后一步,解释器从上到下执行字节码。它加载模块内部所定义的所有函数和变量,并将其作为模块对象的属性。
07
本文重点介绍了Python中模块如何在后台加载,并作为具有属性的对象提供给用户的。模块有利于编写易于维护和扩展的大型应用程序。了解模块的功能可以帮助我们做出改进代码的重要决定。例如,我们可以使用懒加载来避免导入一些不必要的模块。
您学废了嘛?
点击上方小卡片关注我
扫码进群,交个朋友!


