• Python模块:模块搜索顺序、内置属性(__file__和__name__)、开发原则


    欢迎关注博主 python老鸟 或 前往 『Python自学网』, 从基础入门免费课程开始,逐步深入学习python全栈体系课程,适合新手入门到精通全栈开发。


    免费专栏传送门:《Python基础教程

    目录

    一、模块的搜索顺序

    1》Python解释器在导入模块时,对模块文件的搜索顺序:

    2》文件和模块同名报错验证:

    3》 模块内置属性__file__

    二、开发原则

    三、内置属性__name__

    1》实际开发场景:

    2》__name__属性:

    3》代码测试演练:

    4》在很多Python文件中都会看到以下格式的代码:


    一、模块的搜索顺序

    1》Python解释器在导入模块时,对模块文件的搜索顺序:

    搜索顺序:

    1. 搜索当前目录指定模块名的文件,如果有就直接接导入
    2. 如果没有,就会到系统目录搜索指定模块名的文件

    提醒:在开发时给文件起名,不要和系统的模块文件重名,如果重名可能导致原本能正常执行的程序就没办法执行了。

    代码示例:

    1. import random
    2. ran = random.randint(0, 100)
    3. print(ran)

    正常执行结果:随机生成一个79的数字

     

    注意:如果当前目录下存在一个random.py的文件,程序就没办法正常执行了。这个时候,Python的解释器会加载当前目录下的random.py,而不会加载系统的random模块。

    2》文件和模块同名报错验证:

    新建一个random.py文件和模块同名,可以看出PyCharm也给我们提示了(randinth函数有个灰色底纹),此时再来运行文件,报错


    3》 模块内置属性__file__

    Python中,每一个模块都有一个内置属性__file__,这个内置属性可以查看模块的完整路径。

    分别从两种情况来看看完整路径:

    1.random.py文件存在,和模块名冲突情况,如下图:

     

    2删除random.py文件:

    点击右键打开面板点击Delete,出现一个对话框点击OK后继续出现一个面板,这里我们点击Delete Anyway。

    删除提示信息,random文件已经被其他文件件导入了,是否确定删除

    3.删除后运行代码,查看random模块完整路径,如下图:

     


    二、开发原则

    原则:

    每一个程序员开发出来的文件都应该是可以被导入的

    1. 一个独立的python文件就是一个模块
    2. 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍

    代码验证:文件中所有没有任何缩进的代码都会被执行一遍

    md_模块文件代码:

    print("小夏开发的模块文件")

    md_测试导入文件代码:

    1. import md_模块
    2. print("+" * 30)

    执行测试导入文件代码结果:

    可以看出,模块中的输出代码也被打印出来了,模块可以看作是工具包,模块向外界提供工具——全局变量、函数、类。上面模块中利用print输出的代码并不是提供的工具——直接执行的代码不是向外界提供的工具

    遇到一个问题:模块文件被导入时,能够直接执行的代码不需要被执行。

    做个假设:

    在小夏的模块文件中写了个函数,并调用函数测试这个函数是否可以正常运行。

    代码如下:

    1. def say_hello():
    2. print("小夏和你打招呼说:你好!")
    3. # 模块文件被导入时,能够直接执行的代码不需要被执行
    4. print("小夏开发的模块文件")
    5. say_hello()

    测试导入文件执行代码结果:

    后台输出了分隔线,但是把小夏在模块中测试的代码也输出了,而这些测试代码并不需要被执行,如何就解决这个问题呢?利用__name__属性,请继续往下看!


    三、内置属性__name__

    1》实际开发场景:

    在实际开发中,每一个模块都是独立开发的,大多都有专人负责,开发人员通常会在模块下方增加一些测试代码(仅在模块内使用,而被导入到其他文件中不需要执行)

    2》__name__属性:

    1. __name__可以做到测试模块的代码只在测试情况下被运行,而在被导入时不会被执行
    2. __name__是python的一个内置属性,记录着一个字符串(保存的是一个字符串)
    3. 如果是被其他文件导入的,__name__就是模块名
    4. 如果是当前执行的程序,__name__是__main__(永远是固定的__main__)

    3》代码测试演练:

    1.在模块中执行__name__,执行结果永远都是__main__

    2.被其他文件导入,在md_测试导入文件中执行结果——模块文件名:

    3.让测试代码只有在执行模块时才会被运行

    利用执行模块,__name__属性保存在字符串永远都是__main__这一点来进行判断:把测试代码放在判断里.

    代码:

    1. def say_hello():
    2. print("小夏和你打招呼说:你好!")
    3. if __name__ == "__main__":
    4. # 如果执行模块,结果永远是__main__
    5. print(__name__)
    6. # 模块文件被导入时,能够直接执行的代码不需要被执行
    7. print("小夏开发的模块文件")
    8. say_hello()

    模块文件依旧可以正常运行:

    测试导入文件执行结果:测试代码不会被执行

     

    4》在很多Python文件中都会看到以下格式的代码:

    1. # 导入模块
    2. # 定义全局变量
    3. # 定义函数
    4. # 定义类
    5. # 在代码的最下方
    6. def main():
    7. # 测试代码....
    8. pass
    9. # 根据__name__判断是否执行下方代码
    10. if __name__ == "__main__"
    11. main()

  • 相关阅读:
    【SSL 1535】小罐跳舞(构造)
    自然语言处理综述
    前端测试:自动化测试知识扫盲
    Yearning-SQL审核平台
    java计算机毕业设计在线购物系统源程序+mysql+系统+lw文档+远程调试
    力扣377---组合总和IV(Java、动态规划、中等题)
    【PyTorch深度学习项目实战100例】—— 基于ResNet50实现多目标美味蛋糕图像分类 | 第51例
    要求用一句sql语句打印出A,B各剩了多少
    常见的传输介质及其特性
    [附源码]java毕业设计网上书店的设计
  • 原文地址:https://blog.csdn.net/weixin_48728769/article/details/126931810