浅谈if __name__ == ‘__main__‘

本文详细解释了Python中的魔法函数`__name__`和`if __name__ == '__main__':`的作用。通过实例展示了如何在不同场景下使用它们,尤其是在模块导入时的影响。`if __name__ == '__main__':`用于标记程序入口,确保在直接运行文件时执行特定代码。当模块被导入时,该条件不成立,相关代码不会执行。理解这一点对于组织和控制代码执行流程至关重要。
摘要由CSDN通过智能技术生成

一.if _ name _ == 'main’的理解

__name__是魔法函数的一种,如果大家想详细了解和魔法函数相关的知识点击这里,里面整理了Python中常见的魔法函数用法,都有详细的代码解析:https://zhuanlan.zhihu.com/p/344951719

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。

在某种意义上讲,if _ name_== ‘_ main_’ 也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if _ name_==’_ main_:”这条代码的意义之一。

二.实验

在Test16.py文件中写下如下几行代码:

print("GO GO GO")
print(__name__)
if __name__ == '__main__':
    print("Andy is the master !")

在Test17.py文件中写下如下几行代码:

from package0 import Test16

if __name__ == '__main__':
   print("dddd")
   print(Test16.__name__)
   print(__name__)

运行Test16.py文件,得到结果,如下图:
在这里插入图片描述
我们看到,Test16.py的__name__就是__main__。

随即我们运行Test17.py文件,得到结果,如下图:
在这里插入图片描述
① 运行Test17.py,发现涉及导包操作,先运行导入的模块Test16,py文件。

② 到Test16,py的 if _ name_== ‘_ main_’ 这一行的时候,发现不对,Test16.py的__name__与源文件Test17.py本身的__name__是不一样的,所以Test16.py中if _ name_== ‘_ main_’ 下面的代码不再运行(也就是Andy is the master !这一条语句不再打印输出)。

③ 运行完Test16,py后,运行Test17.py自己的代码,而运行到 if _ name_== ‘_ main_’ 时,判断Test17.py的__name__就是Test17.py本身的__name__,执行下面的代码(也就是dddd等语句将会被打印)。

我就想能不能这么打印一下 : print(Test17._ name _),在Test17.py中添加代码,运行,报错了,错误如下:
在这里插入图片描述
原来是没有识别到Test17这个模块,我还想到了能不能用 print(this. _ name _) 、print(self. _ name _)来打印这个属性,发现依然报错,如果哪位大佬知道除了print( _ name _)这个方法来打印这个内置属性,一定要在评论区中回复啊!!!博主我当场拜师,哈哈哈哈

三.结论

  1. 每一个单独的python文件,运行的时候,打印自己的__name__都是__main__,实则是有区别的,每一个python文件的__name__都是不一样的,是包名.文件名(eg:package0.Test16)。
  2. 如果涉及导包操作,解释器,会先去执行导入模块的代码(eg:Test16.py)
  3. 对于if _ name_== ‘_ main_’ 下面的语句就能否被执行:
    I.不涉及导包操作源文件中的if _ name_== ‘_ main_’ 下的语句可以被执行
    II.涉及导包操作源文件中的if _ name_== ‘_ main_’ 下的语句可以被执行,但是导入文件中的if _ name_== ‘_ main_’ 下的语句将不被执行。(所以可以将测试代码写到导入文件中的if _ name_== '_ main_'下,让它在该执行的时候执行 )

参考:https://www.zhihu.com/question/49136398

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值