持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
1. 模块搜索顺序
Python的解释器在导入模块时,会:
- 搜索当前目录指定模块名的文件,如果有就直接导入
- 如果没有,再搜索系统目录 在开发时,给文件起名,不要和系统的模块文件重名
Python中每一个模块都有一个内置属性__file__可以查看模块的完整路径
代码演示如下所示:
import random
print(random.__file__)
程序运行结果如下图所示:通过此内置属性就可以查看random模块的完整路径
2. 原则--每一个文件都应该是可以被导入的
- 一个独立的Python文件就是一个模块
- 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍 实际开发场景
- 在实际开发中,每一个模块都是独立开发的,大多都有专人负责
- 开发人员通常会在模块下方增加一些测试代码
- 仅在模块内使用,而被导入到其他文件中不需要执行
2.1 __name__属性
- __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行
- __name__是Python的一个内置属性,记录着一个字符串
- 如果是被其他文件导入的,__name__是 模块名称
- 如果直接执行模块,__name__ 保存的字符是 __main__ 在很多Python文件中都会看到以下格式的代码
2.2 案例演示
在main函数中针对文件进行测试
新建名为EX_1模块.py文件,其中代码如下所示:
def say_hello():
print("你好你好,我是say hello")
# 如果直接执行模块,__main__
if __name__ == "__main__":
print(__name__)
# 文件被导入时,能够直接执行的代码不需要被执行
print("小明开发的模块")
say_hello()
运行EX_1模块.py文件,得到的运行结果如下图所示:因为如果直接执行模块本身,__name__ 保存的字符是 __main__,该程序中通过if判断,因为此时__name__保存的字符为__main__,因此会执行if下方测试代码。
新建名为EX_1测试导入.py文件,其中代码如下所示:
import EX1_模块
print("-" * 50)
运行结果如下图所示:因为该文件调用了EX_1模块.py模块,__name__保存的字符为模块名,不符合if条件,因此不会执行if下方的测试代码。