【Python模块2】- 模块搜索顺序、内置属性、开发原则
一、模块的搜索顺序
1》Python解释器在导入模块时,对模块文件的搜索顺序:
搜索顺序:
- 搜索当前目录指定模块名的文件,如果有就直接接导入
- 如果没有,就会到系统目录搜索指定模块名的文件
提醒:在开发时给文件起名,不要和系统的模块文件重名,如果重名可能导致原本能正常执行的程序就没办法执行了。
代码示例:
import random
ran = random.randint(0, 100)
print(ran)
正常执行结果:随机生成一个79的数字
注意:如果当前目录下存在一个random.py的文件,程序就没办法正常执行了。
这个时候,Python的解释器会加载当前目录下的random.py,而不会加载系统的random模块。
文件和模块同名报错验证:
新建一个random.py文件和模块同名,可以看出PyCharm也给我们提示了(randinth函数有个灰色底纹),此时再来运行文件,报错
2》 模块内置属性__file__
Python中,每一个模块都有一个内置属性__file__,这个内置属性可以查看模块的完整路径。
分别从两种情况来看看完整路径:
1.random.py文件存在,和模块名冲突情况,如下图:
2删除random.py文件:
点击右键打开面板点击Delete,出现一个对话框点击OK后继续出现一个面板,这里我们点击Delete Anyway。
删除提示信息,random文件已经被其他文件件导入了,是否确定删除
3.删除后运行代码,查看random模块完整路径,如下图:
二、开发原则
原则:
每一个程序员开发出来的文件都应该是可以被导入的
- 一个独立的python文件就是一个模块
- 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍
代码验证:文件中所有没有任何缩进的代码都会被执行一遍
md_模块文件代码:
print("小夏开发的模块文件")
md_测试导入文件代码:
import md_模块
print("+" * 30)
执行测试导入文件代码结果:
可以看出,模块中的输出代码也被打印出来了,模块可以看作是工具包,模块向外界提供工具——全局变量、函数、类。上面模块中利用print输出的代码并不是提供的工具——直接执行的代码不是向外界提供的工具!
遇到一个问题:
模块文件被导入时,能够直接执行的代码不需要被执行。
做个假设:
在小夏的模块文件中写了个函数,并调用函数测试这个函数是否可以正常运行。
代码如下:
def say_hello():
print("小夏和你打招呼说:你好!")
# 模块文件被导入时,能够直接执行的代码不需要被执行
print("小夏开发的模块文件")
say_hello()
测试导入文件执行代码结果:
后台输出了分隔线,但是把小夏在模块中测试的代码也输出了,而这些测试代码并不需要被执行,如何就解决这个问题呢?利用__name__属性,请继续往下看!
三、内置属性__name__
实际开发场景:
在实际开发中,每一个模块都是独立开发的,大多都有专人负责,开发人员通常会在模块下方增加一些测试代码(仅在模块内使用,而被导入到其他文件中不需要执行)
__name__属性:
- __name__可以做到测试模块的代码只在测试情况下被运行,而在被导入时不会被执行。
- __name__是python的一个内置属性,记录着一个字符串(保存的是一个字符串)
- 如果是被其他文件导入的,__name__就是模块名
- 如果是当前执行的程序,__name__是__main__(永远是固定的__main__)
代码演练:
1.在模块中执行__name__,执行结果永远都是__main__
2.被其他文件导入,在md_测试导入文件中执行结果——模块文件名:
3.让测试代码只有在执行模块时才会被运行
利用执行模块,__name__属性保存在字符串永远都是__main__这一点来进行判断:把测试代码放在判断里
代码:
def say_hello():
print("小夏和你打招呼说:你好!")
if __name__ == "__main__":
# 如果执行模块,结果永远是__main__
print(__name__)
# 模块文件被导入时,能够直接执行的代码不需要被执行
print("小夏开发的模块文件")
say_hello()
模块文件依旧可以正常运行:
测试导入文件执行结果:测试代码不会被执行
在很多Python文件中都会看到以下格式的代码:
# 导入模块
# 定义全局变量
# 定义函数
# 定义类
# 在代码的最下方
def main():
# 测试代码....
pass
# 根据__name__判断是否执行下方代码
if __name__ == "__main__"
main()
分享网站:《Python自学网》基础入门到逐步深入 | 适合新手入门到精通 | python全栈体系课程
相关文章
- python skitlearn_Python sklearn
- pycharm创建python虚拟环境好处_pycharm创建虚拟环境很慢
- python语言变量命名规则有什么_Python变量命名规则(超级详细)
- python人工智能学习笔记_[Python] 人工智能与自然语言处理学习笔记(1)[通俗易懂]
- python海龟绘图画圆_Python启蒙之海龟作图「建议收藏」
- Python实现自动回复_python 微信机器人
- 如何在python中惰性地读取文件?
- 下列python语句的输出结果是print_下列 Python语句的输出结果是「建议收藏」
- VSCode中设置Python语言自动格式化的方案
- 1行Python代码,把PPT转成图片,python-office功能更新~
- Python Fiddler抓包工具教学,获取公众号(pc客户端)数据
- Python 接口测试之接口关键字封装
- python-高级协程编程-asyncio的高级用法(二)
- Linux系统快速运行Python脚本(linux运行python脚本)
- 在Linux上搭建Python开发环境(linux搭建python环境)
- Python与MongoDB 无缝连接(python连接mongodb)
- 在Python中简单调用MySQL(python调用mysql)
- Python脚本实现Linux命令快捷控制(python执行linux命令)
- Python中删除文件的程序代码
- python基础教程之python消息摘要算法使用示例
- Python中使用PyHook监听鼠标和键盘事件实例