Python网络编程(第3版) 中文完整pdf下载
在python模块是对象,所有模块都有一个内置属性__name__ 。
__name__ 是一个变量(属性),输出的值有2可能
一、什么情况输出值为__mian__?什么情况输出值为脚本文件名称?
实例:http://www.3qphp.com/python/pybase/127.html
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脚本看看结果
结果是t()方法被执行了,说明执行t.py时__name__输出的值为__main__ ,而且从print('我是'+__name__+'文件')打印的结果也看出来了的确如此
b、只执行str.py脚本文件看看结果
执行结果发现是空白为什么?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的结果
发现输出的结果有内容了,而且结果中__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 script main()
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.html</</a>a>
转载请注明:谷谷点程序 » python __name__ 和 __main__之间的关系,if __name__ == '__main__'的作用是什么