文章目录

1 前言2 原理3 模块4 `__name__`变量的作用参考

1 前言

在很多Python程序中,我们都会遇到if __name__ == "__main__"的情况,却不知道为何要这样做

在很多编程语言中,如C、Java等,都需要程序的入口,一般都是main函数,程序会从main函数开始执行。而Python是脚本语言,是动态解释执行的,即从脚本的第一行开始,执行到最后,没有统一的入口。

Python的源码文件除了直接可以被运行以外,还可以作为模块被导入,当模块被导入的时候,其中的源码会被执行(这部分代码被当作顶层代码,这里不做深入讨论,可以认为顶层代码即没有缩进的代码)

例子:

在相同路径创建import_file.py

def call_func():

print("call_func is called!")

pass

call_func()

创建run_file.py

import import_file

print("Hello run_file!")

输出:

call_func is called!

Hello run_file!

当我们导入某些包的时候,并不希望文件的某些顶层代码被执行,有些是需要被执行的比如import ...,此时就需要使用if __name__ == "__main__":

修改import_file.py文件

def call_func():

print("call_func is called!")

pass

if __name__ == "__main__":

call_func()

此时输出的结果为:

Hello run_file!

2 原理

首先我们需要直到__name__变量是什么?

当py文件被当作模块导入的时候,此时__name__为模块的名字。所谓模块的名字,导入的是一个文件,则模块名为文件名(无后缀),比如pandas,那么__name__的值为"pandas";如果导入的是一个类名或者变量名,则模块名为类名或者函数明,比如:from matplotlib import pyplot as plt, __name__的值为pyplot,尽管使用as 在文件被Python解释器执行的时候,此时__name__的值为"__main__" 因此为了避免部分顶层代码的执行,使用if判断模块,来控制其执行

例子:

我们将上面的例子的输出改为print(__name__),首先我们执行import_file.py(没有使用if __name__ == "__main__":),程序的输出结果为:

def call_func():

print(__name__)

pass

# if __name__ == "__main__":

call_func()

>>>

__main__

我们再执行run_file.py,可以看到输出为:

import import_file

print(__name__)

>>>

import_file

__main__

以上证明了我们的论述

3 模块

Python中导入的包均已模块的形式进行导入,那模块是什么?即模块是能够独立运行的代码片段,在逻辑上与其它代码分开;可以理解为独立完成某一功能的代码段。Python中的模块可以是文件,包,类或者函数,它们都能独立完成一些功能

使用__name__属性来显示模块的名称:

import pandas as pd

print(pd.__name__)

输出的结果为: pandas 虽然我们使用了as,但是导入的模块仍按照pandas文件名进行导入

如果我们导入模块中的模块,那么将导入子模块而不是整个模块

from matplotlib import pyplot as plt

print(plt.__name__)

输出的结果为:matplotlib.pyplot,而输出print(matplotlib.__name__)则会报错: NameError: name 'matplotlib' is not defined 说明模块没有被导入

4 __name__变量的作用

反应一个包的结构

其中所有文件的内容均为: print(__name__)

执行

import my_module.b.c

输出:

my_module

my_module.b

my_module.b.c

结果:

可见导入时,都执行了__init__.py,并产生了缓存,展示了包所在的层次结构

参考

如何简单地理解Python中的 if name == ‘main’: https://blog.csdn.net/yjk13703623757/article/details/77918633

Python 中的 if name == ‘main’ 该如何理解:https://blog.konghy.cn/2017/04/24/python-entry-program/

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: