Python 导入模块的本质

文摘   科技   2024-10-10 09:24   上海  

点击蓝字,关注山海摸鱼人

目录:

  1. 导入模块的基本概念
  2. 导入模块的方式
  3. 导入模块的本质
  4. 模块缓存与 .pyc 文件
  5. 示例代码演示

Python 模块是一个包含所有自定义的函数和语句的文件,它允许我们将代码组织成逻辑部分,并且可以在多个程序中重用这些代码。这不仅提高了代码的可维护性,还使得多人协作开发大型项目成为可能。

导入模块的基本概念

当我们说“导入模块”,其实是指将一个外部文件中的代码加载到当前脚本中来使用。这个过程包括了两个步骤:查找模块和执行模块。查找模块是通过 sys.path 来进行的,这是一个目录列表,Python 会依次在这个列表中寻找指定的模块。一旦找到模块,Python 就会执行该模块中的代码,并根据导入的方式提供访问接口。

导入模块的方式

Python 提供了几种不同的方式来导入模块或模块中的特定部分:

1、直接导入整个模块:

import 模块名

这是最简单的形式,它会在内存中创建一个名为 模块名 的变量,该变量指向导入的模块对象。

2、从模块中导入特定的部分:

from 模块名 import 成员名

这种方式允许我们只导入需要使用的成员(比如函数、类等),而不需要每次都写 模块名.成员名 来调用它们。

3、给导入的模块起别名:

import 模块名 as 别名
from 模块名 import 成员名 as 别名

当模块名称较长或者为了避免命名冲突时,可以使用这种方式。

4、导入模块的所有成员:

from 模块名 import *

虽然这样做看起来很方便,但不推荐这样使用,因为它可能会导致命名空间污染,难以追踪某个名称是从哪里来的。

Python 导入模块的本质

当你导入一个模块时,Python 实际上做了以下事情:

  • 首先,它检查该模块是否已经被导入过。如果是首次导入,那么:
    • Python 会读取并执行模块文件中的代码。
    • 它会创建一个模块对象,该对象作为命名空间保存着模块内定义的所有全局变量。
    • 如果再次尝试导入同一个模块,Python 只会返回已经存在的模块对象,而不会重新执行模块代码。

在程序中多次导入同一模块多少次,Python只会执行一次代码。这一点对于避免循环导入问题非常关键。

模块缓存与 .pyc 文件

当 Python 第一次运行一个模块时,为了提高后续加载的速度,它会自动生成一个 .pyc 文件,这是一种编译后的字节码文件,通常放在一个名为 __pycache__ 的隐藏目录下。下次再导入该模块时,如果源文件没有改变,则 Python 直接使用这个 .pyc 文件,从而加快了启动时间。

示例代码演示

接下来,我们通过一些具体的例子来深入理解上述概念。

首先,创建一个简单的模块文件 my_module.py,内容如下:

# my_module.py
print("this is my_module")  # 模块被导入时打印这条信息

def hello():
    print("你好,山海摸鱼人!")

name = "ShanHai"

然后,在同一个目录下创建另一个文件 test_my_module.py,用于测试导入 my_module 模块的不同方法。

1、直接导入整个模块:

# test_my_module.py
import my_module

print(type(my_module), my_module)  # 输出模块类型及位置
print(my_module.name)  # 访问模块内的全局变量
my_module.hello()  # 调用模块内的函数

运行结果:

<class 'module'> <module 'my_module' from '/path/to/my_module.py'>
this is my_module
ShanHai
你好,山海摸鱼人!

2、从模块中导入特定成员:

# test_my_module.py
from my_module import name, hello

print(name)  # 直接访问变量
hello()  # 直接调用函数

注意这里不能直接引用 my_module,因为它是通过 from...import 方式导入的。

3、使用 as 给导入的对象命名:

# test_my_module.py
import my_module as fm
from my_module import name as n, hello as h

print(fm.name)  # 使用别名访问
h()  # 使用别名调用
print(n)  # 打印变量

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章