当前位置:首页>python>Python 模块导入与 __name__ 完全详解

Python 模块导入与 __name__ 完全详解

  • 2026-10-11 08:36:44
Python 模块导入与 __name__ 完全详解

一、什么是 Python 模块?

在 Python 中,一个 .py 文件就是一个模块(Module)。

  • • 代码复用:把常用功能写成单独文件,其他地方直接导入。
  • • 代码管理:几千行代码拆分成多个文件,更容易维护。
  • • 包管理:多个模块组成包(Package),方便组织大型项目。

二、模块导入的四种方式

1. import 模块名(最常用)

导入整个模块,使用时必须加模块名前缀。

语法:

import 模块名

示例:导入标准库 math

import math

print(math.pi)      # 调用模块内的变量
print(math.sqrt(16)) # 调用模块内的函数

优点:

  • • 不会污染当前命名空间(不会和内部变量冲突)
  • • 一目了然,知道变量来自哪个模块

2. from 模块名 import 成员(导入指定成员)

从模块中直接导入特定的函数/变量/类,使用时不用加模块名前缀。

语法:

from 模块名 import 函数名, 变量名

示例:

from math import pi, sqrt

print(pi)      # 直接使用
print(sqrt(16))

优点:

  • • 代码更简洁,少打字
  • • 高频函数使用方便

缺点:

  • • 容易冲突:如果内部有同名变量,会覆盖模块成员。

3. from 模块名 import *(导入全部成员)

一次性导入模块所有成员,极度不推荐!

语法:

from math import *

示例:

from math import *

print(pi)
print(cos(0))

❌ 严重缺点:

  • • 命名冲突:如果你的变量名和模块内的同名,会被直接覆盖。
  • • 代码可读性差:不知道变量来自哪个模块。
  • • 代码臃肿:导入了一堆用不到的东西。
  • • 新手大忌:不要用!

4. import ... as ...(别名导入)

给模块或成员起别名,解决长名或冲突问题。

语法1:给模块起别名

import 模块名 as 别名

示例:

import datetime as dt

print(dt.datetime.now())

语法2:给成员起别名

from math import sqrt as square_root

示例:

from math import sqrt as sq

print(sq(25)) # 5

优点:

  • • 解决模块名太长的问题
  • • 解决同名冲突问题

三、name == "main" 的作用(核心重点)

这是 Python 中最经典的语法糖,几乎每个 Python 文件都会用到。

1. 核心原理

  • • __name__ 是 Python 内置的特殊变量。
  • • 当 直接运行 某个 .py 文件时,Python 解释器会自动把 __name__ 设为字符串 "__main__"。
  • • 当 被导入 其他文件使用时,__name__ 会变成模块的名字(文件名)。

2. 作用一:测试代码(入口)

让文件既能作为模块导入,又能独立运行测试代码。

示例:

假设我们有一个文件 utils.py

# utils.py
defadd(a, b):
return a + b

# 👇 核心代码
if __name__ == "__main__":
# 这里的代码,只有直接运行 utils.py 时才会执行
print("开始测试 add 函数")
print(add(1, 2)) # 3
print("测试结束")

情况 A:直接运行 utils.py

开始测试 add 函数
3
测试结束

情况 B:在另一个文件 main.py 中导入

# main.py
import utils

print(utils.add(10, 20)) # 30

运行 main.py,不会执行utils.py 里的 if __name__ == "__main__": 块。
输出只有:

30

3. 作用二:模块安全隔离

防止导入时执行不必要的初始化代码或测试代码,保证模块只作为功能提供者,而不是运行入口。


四、导入路径与查找顺序(进阶)

Python 导入模块时,会按以下顺序查找:

  1. 1. 当前目录(程序运行的目录)
  2. 2. PYTHONPATH 环境变量指定的目录
  3. 3. Python 标准库目录(如 math, os 等)
  4. 4. 第三方库安装目录(site-packages)

查看路径

import sys
print(sys.path)

动态添加路径

import sys
sys.path.append("/path/to/your/module/folder")
import my_module

五、常见易错点总结

易错1:导入时写错模块名

  • • 区分大小写!import Math 不同于 import math
  • • 不要把 .py 后缀写进去!import math.py 是错的。

易错2:使用 from ... import *

  • • 强烈不推荐。尽量用 import 模块名 或 from 模块名 import 成员。

易错3:循环导入

  • • 模块 A 导入 B,模块 B 又导入 A → 报错。
  • • 解决方法:优化代码结构,避免相互依赖。

易错4:__name__ 拼写错误

  • • 必须是双下划线 __,前后各两个。
  • • 写成 name == "main" 会永远为 False,代码永远不执行。

📚 综合练习题(带详细讲解)

练习1:import 与 from...import 区别

写出以下代码的运行结果,并解释原因。

# module_a.py
x = 100

deffunc():
print("来自 module_a 的 func")

# main.py
from module_a import x
import module_a

print(x)
print(module_a.x)
module_a.func()

答案:

100
100
来自 module_a 的 func

讲解:

  • • from module_a import x 把全局变量 x 导入当前命名空间。
  • • import module_a 导入整个模块,模块内的 x 仍然存在。
  • • 两个 x 是不同空间的同名变量,互不影响。

练习2:name == "main" 用法

以下代码分别在直接运行和被导入时,输出有什么不同?

# test.py
print("文件开始执行")

if __name__ == "__main__":
print("我是主程序")
else:
print("我被导入了")

print("文件结束执行")

答案:

直接运行 test.py

文件开始执行
我是主程序
文件结束执行

在另一个文件中 import test

文件开始执行
我被导入了
文件结束执行

讲解:

  • • 直接运行时,__name__ 是 "__main__",执行 if 块。
  • • 被导入时,__name__ 是 "test",执行 else 块。

练习3:as 别名用法

用别名简化模块调用。

import datetime as dt

current_time = dt.datetime.now()
print(current_time.strftime("%Y-%m-%d %H:%M:%S"))

讲解:

  • • 给 datetime 模块起别名 dt,代码更简洁。

📝 本章超级总结

模块导入

  1. 1. import 模块名:最推荐,完整清晰,不污染命名空间。
  2. 2. from 模块名 import 成员:简洁,适合高频成员。
  3. 3. from 模块名 import *:❌ 绝对不要用。
  4. 4. import ... as ...:给长模块/成员起别名,解决冲突。

name == "main"

  1. 1. 直接运行文件时,__name__ 为 "__main__"。
  2. 2. 被导入时,__name__ 为模块名。
  3. 3. 核心用途:写测试代码入口,保证文件既可导入又可独立运行。

最新文章

随机文章