目录:
导入模块的基本概念 导入模块的方式 导入模块的本质 模块缓存与 .pyc 文件 示例代码演示
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) # 打印变量