解释一下python程序中_name_属性的作用,python __name__ 和 __main__之间的关系,if __name__ == '__main__'的作用是什么...

在python模块是对象,所有模块都有一个内置属性__name__ 。

__name__  是一个变量(属性),输出的值有2可能

c9c058f7dad9f913532921deae9714b6.gif

d9883585c7df2624ef9f944da49c73de.png

一、什么情况输出值为__mian__?什么情况输出值为脚本文件名称?

1、文件t.py#定义一个方法t(),通过print打印输出__name__的值

def t():

print('我是'+__name__+'文件')

#属性__name__的值等于__main__时执行t()方法

if __name__=='__main__':

t()

2、文件str.py#引入t.py文件(模块)

import t

a、只执行t.py脚本看看结果

2b8125e6a636e0d8330cfe6ce0827583.png

结果是t()方法被执行了,说明执行t.py时__name__输出的值为__main__ ,而且从print('我是'+__name__+'文件')打印的结果也看出来了的确如此

b、只执行str.py脚本文件看看结果

f3a03d258e10eeb0193af66ea4ef4efc.png

执行结果发现是空白为什么?str.py执行时,首先引入了t.py文件,引入之后执行t.py中的脚本时,发现__name__的值并不等于__main__所以就没有执行t()方法。那么执行str.py时__name__的值为多少?它的值其实为t,具体原因后面讲解,这里先看一个反例证明一下

修改t.py脚本中的代码如下:

修改中删除了if __name__=='__main__':判断直接调用t()方法#定义一个方法t(),通过print打印输出__name__的值

def t():

print('我是'+__name__+'文件')

t()

看看修改t.py之后执行str.py的结果

e81a38a3dfabd1d8fbcf37390d5f77fc.png

发现输出的结果有内容了,而且结果中__name__的值变成了t,而不是之前的__main__

总结说明:

1. 模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。

2. python手册中的原文解释

'__main__' is the name of the scope in which top-level code executes. A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt.

A module can discover whether or not it is running in the main scope by checking its own __name__, which allows a common idiom for conditionally executing code in a module when it is run as a script or with python -m but not when it is imported:

if__name__=="__main__":# execute only if run as a scriptmain()

3. if __name__ == "__main__"

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

作用:当前脚本文件被直接执行时,才运行if __name__ == '__main__'作用域下的代码块,如果脚本文件被引入到其他文件中在执行的话,不运行if __name__ == '__main__'作用域下的代码块。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!http://www.3qphp.com/python/pybase/127.htmla>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值