python 魔法方法(一): __name__
python
本文字数:823 字 | 阅读时长 ≈ 3 min

python 魔法方法(一): __name__

python
本文字数:823 字 | 阅读时长 ≈ 3 min

__name__

__name__

name 是 python 中一个魔法方法,他是一个隐含的变量,代表当前模块的名字,如果当前模块是主模块,则 name 的值为 __main__,否则为模块的名字

怎么去理解这个魔法方法呢?我们先了解 python 这个语言,python 是一种解释型脚本语言,执行时从文件顶部,也就是说从代码的最起始位置逐行翻译,因此 python 是没有统一的程序入口的

__name__ 魔法最常用的一个例子是 if __name__ == "__main__",既然 python 是从主程序的第一行开始执行的,那么在导入其他 py 文件中的方法的时候,就需要跳转到其他文件中并从第一行运行其代码,产生不必要的输出。要避免这种情况,就可以使用 __name__ 来判断当前模块是否是主模块,如果是主模块,则执行下面的语句,否则不执行

这个语句的意思是,如果当前模块是主模块,则执行下面的语句,否则不执行,下面我们看一个例子

我们假设当前目录如下

- main.py
    from util import PI
    print("我是main文件")
    print("当前文件名是: ", __name__)
    print("PI的值是: ", PI)

- util.py
    PI = 3.1415926
    print("我是util文件")
    print("当前文件名是: ", __name__)

运行 main.py 文件,输出如下

我是util文件
当前文件名是:  util
我是main文件
当前文件名是:  __main__
PI的值是:  3.14

程序运行过程如下: 当我们运行 main.py 文件时(此时该就是主文件),从 util.py 中导入了 PI 变量,但由于 python 是逐行执行的,他会将 util.py 中内容全部执行完,在回到主文件,由于 util.py 中有 print 语句,因此会输出其结果,然后再回到主文件,输出主文件中的内容

__name__语句是如何发挥作用的呢?

当我们运行 main.py 时,该文件就是主文件,__name__ 就会被赋值为 __main__,但由于 util.py 不是主文件,因此 __name__ 就会被赋值为 util

本质上__name__这个魔法函数就是一个变量,当运行主文件时他就是__main__,运行其他包时就是包名

避免不必要的输出

知道上述原理之后,我们来修改上述程序,在运行 main.py 文件时,我们显然是不需要运行 util.py 中的 print 函数的,只需要其中的 PI 变量即可,因此我们修改上述文件为

- main.py
    from util import PI
    print("我是main文件")
    print("当前文件名是: ", __name__)
    print("PI的值是: ", PI)

- util.py
    PI = 3.1415926
    if __name__ == "__main__":  # add this line
        print("我是util文件")
        print("当前文件名是: ", __name__)

输出结果为

我是main文件
当前文件名是:  __main__
PI的值是:  3.1415926

可以看到结果中没有 util.py 的 print 结果了,此外为了保险起见,我们最好讲 main.py 中的 print 语句之前也加上 if __name__ == "__main__":,这样就可以保证在其他包导入 main.py 文件时不会执行 main.py 中的 print 语句了

9月 09, 2024
9月 06, 2024